比较不同行

时间:2017-02-11 21:10:24

标签: sql sql-server tsql

首先我正在使用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或第3行的s.theDate进行比较。

示例数据如下:

enter image description here

期望的结果:

我想拉出t.bitfield和s.bitfield相反的所有行对,并且t.theDate和s.theDate是相反的。

从图像中可以看到行(3& 4),(5& 6),(7& 8)......等等。

我真的很感激任何帮助!

可以吗?

2 个答案:

答案 0 :(得分: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
              );

答案 1 :(得分:0)

Varinant 1:您似乎想要使用%process_two%

ranking function

Varinant 2: 要获得标量值,您可以使用排名函数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 lag。或子查询。

Varinant 3: 您可以使用lead,但如果您不想复制,则必须指定唯一的非跟踪密钥。

Varinant 4: 您可以使用selfjoin

你的问题不太清楚,所以我希望这是你的目标。