2017-02-11 5 views
0

まずはSQL Serverを使用しています。異なる行のフィールドを比較する

Iは、以下の例のように、それ自体の表に参加しています:私は、生成データセットからランダム行(すなわち、X)を取る場合

SELECT t.theDate, 
    s.theDate, 
    t.bitField, 
    s.bitField, 
    t.NAME, 
    s.NAME 
FROM table1 t 
INNER JOIN table1 s ON t.NAME = s.NAME 

行Xの任意のフィールドの値を、行X-1または行X + 1の任意のフィールドの値と比較できますか?

例:

希望

enter image description here

:私は、サンプル・データがどのように見える3

行の行4またはs.theDateにs.theDateに行5にt.theDateを比較したいです結果:

t.bitfieldとs.bitfieldが反対で、t.theDateとs.theDateが反対の行のすべてのペアを取りたいと思っています。画像から

だろう行(3 & 4)、(5 & 6)、(7 & 8)...など

私は本当にすべての助けに感謝!

できますか?

+0

注文を指定する必要があります... – dana

+0

dbmsは使用していますか? – McNets

+3

サンプルデータと希望の結果を入力してください。 –

答えて

0

これはいかがですか?

WITH ts as (
     SELECT t.theDate as theDate1, s.theDate as theDate2, 
      t.bitField as bitField1, s.bitField as bitField2, 
      t.NAME -- there is only one name 
     FROM table1 t INNER JOIN 
      table1 s 
      ON t.NAME = s.NAME 
    ) 
SELECT ts.* 
FROM ts 
WHERE EXISTS (SELECT 1 
       FROM ts ts2 
       WHERE ts2.name = ts.name AND 
        ts2.theDate1 = ts.theDate2 AND 
        ts2.theDate2 = ts.theDate1 AND 
        ts2.bitField1 = ts.bitField2 AND 
        ts2.bitField2 = ts.bitField1 
      ); 
+0

ts2は何ですか? – Fendec

+0

@Fendec。 。 。今はテーブルエイリアスです。これは以前のものであることを意図していたが、テーブルそのものは欠落していた。 –

0

Varinant 1:あなたがranking functionを使用したいように見えます。

if objcet_id('tempdb..#TmpOrderedTable') is not null drop table #TmpOrderedTable 
select *, row_number(order by columnlist, (select 0)) rn 
into #TmpOrderedTable 
from table1 t 

select * 
from #TmpOrderedTable t0 
inner join #TmpOrderedTable tplus on t0.rn = tplus.rn + 1 -- next one 
inner join #TmpOrderedTable tminus on t0.rn = tminus.rn - 1 -- previous one 

Varinant 2: あなたがランキング関数lagleadを使用することができますスカラー値を取得します。またはサブクエリ。

Varinant 3: あなたはselfjoinを使用することができますが、あなたは重複をしたくない場合はユニークnonarbitaryキーを指定する必要があります。

バリエーション4: applyを使用できます。

あなたの質問はあまり明確ではないので、私はあなたの目標だったと思います。

関連する問題