2017-02-11 79 views
0

首先我正在使用SQL Server。比較不同行的字段

我自身加入一個表像在下面的例子:

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上的任何字段中的值與行X-1或行X + 1上的任何字段中的值進行比較嗎?

例子:我要上5行的4行或s.theDate在行比較t.theDate到s.theDate 3.

的樣本數據是這樣的:

enter image description here

期望結果:

我想拉動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鍵,如果你不想重複。

Varinant 4: 您可以使用apply

你的問題不太清楚,所以我希望它是你的目標。