查找给定行中具有特定值的下一行

时间:2017-07-21 13:22:20

标签: sql sql-server tsql

我现在的表看起来像这样。每行都有一个时间值(表按升序排序),以及两个可以跨行复制的值:

Key      TimeCall     R_ID      S_ID
-------------------------------------------
1          100          40        A
2          101          50        B
3          102          40        C
4          103          50        D
5          104          60        A
6          105          40        B

我想返回类似这样的内容,其中对于每一行,应用JOIN,以便共享该行的下一行的S_IDTime_Call {{1}显示(如果该行是给定R_ID的最后一个实例,则为NULL)。例如:

R_ID

非常感谢任何有关如何做到这一点的建议。现在我自己加入了桌子并且错开了我加入的关键,但我知道这对我上面概述的实例不起作用:

Key        TimeCall     R_ID      S_ID      NextTimeCall      NextS_ID
----------------------------------------------------------------------
1          100          40        A         102               C
2          101          50        B         103               D
3          102          40        C         105               B
4          103          50        D         NULL              NULL
5          104          60        A         NULL              NULL
6          105          40        B         NULL              NULL

因此,如果有人能告诉我如何做到这一点,它可以调用不连续的行,非常有必要!

4 个答案:

答案 0 :(得分:1)

使用LEAD()功能:

<View>

SQLFiddle DEMO

答案 1 :(得分:0)

这只是我附近的测试示例...但我认为它可以帮助你,只是适应你的情况,它使用滞后和领导......它适用于SQL Server

if object_id('tempdb..#Test') IS NOT NULL drop table #Test
create table #Test (id int, value int)

insert into #Test (id, value)
values
(1, 1),
(1, 2), 
(1, 3)

select id, 
    value, 
    lag(value, 1, 0) over (order by id) as [PreviusValue], 
    lead(Value, 1, 0) over (order by id) as [NextValue] 
from #Test

结果

id  value   PreviusValue    NextValue
1     1         0               2   
1     2         1               3
1     3         2               0

答案 2 :(得分:0)

使用OUTER APPLY选择与第一个查询具有相同R_ID且具有更高键值字段的前1值

只需在查询的两个部分中将TableName更改为表的实际名称

SELECT a.*, b.TimeCall as NextTimeCall, b.S_ID as NextS_ID FROM
    (
    SELECT * FROM TableName as a
    ) as a
    OUTER APPLY 
    (
    SELECT TOP 1 FROM TableName as b
    WHERE a.R_ID = b.R_ID
    AND a.Key > B.Key
    ORDER BY Key ASC
    ) as b

希望这有帮助! :)

答案 3 :(得分:0)

对于旧版本,这里有一个使用Outer Apply

的技巧
SELECT a.*, 
       nexttimecall, 
       nexts_id 
FROM   table1 a 
       OUTER apply (SELECT TOP 1 timecall,s_id 
                    FROM   table1 b 
                    WHERE  a.r_id = b.r_id 
                           AND a.[key] < b.[key] 
                    ORDER  BY [key] ASC) oa (nexttimecall, nexts_id) 

注意:最好避免使用保留关键字(Key)作为列/表名称。