我现在的表看起来像这样。每行都有一个时间值(表按升序排序),以及两个可以跨行复制的值:
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_ID
和Time_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
因此,如果有人能告诉我如何做到这一点,它可以调用不连续的行,非常有必要!
答案 0 :(得分:1)
答案 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
)作为列/表名称。