我有一个以下格式的表格:
Time Quantity
10:01:01.000 100
10:01:01.001 50
10:01:01.002 0
10:01:01.003 100
10:01:03.001 100
请注意我已根据时间订购了上述行。
我想要交叉加入(或任何其他加入),以便加入仅在第一次高于当前时间而不是全部加入时发生。我的最终结果如下:
Time Quantity Time2 Quantity2
10:01:01.000 100 10:01:01.001 50
10:01:01.001 50 10:01:01.002 0
10:01:01.002 0 10:01:01.003 100
10:01:01.003 100 10:01:03.001 100
10:01:03.001 100 NULL NULL
该表有4200万行和10列。所以,我正在寻找有效的东西。
答案 0 :(得分:5)
在使用SQL Server 2012
时,您可以使用LEAD
SELECT a.Time,
a.Quantity,
LEAD(Time) OVER (ORDER BY Time) Time2,
LEAD(Quantity) OVER (ORDER BY Time) Quantity2
FROM tableName a
答案 1 :(得分:1)
如果时间独特,这将让你前进:
SELECT t1.*, t2.*
FROM myTable t1
LEFT JOIN myTable t2
ON t1.time < t2.time
WHERE NOT EXISTS (
SELECT * FROM
myTable t3
WHERE t3.time > t1.time AND t3.time < t2.time)
答案 2 :(得分:0)
SELECT zt.* , nxt.*
FROM ztable zt
LEFT JOIN ztable nxt ON nxt.ztime > zt.ztime
WHERE NOT EXISTS (
SELECT *
FROM ztable nx
WHERE nx.ztime > zt.ztime
AND nx.ztime < nxt.ztime
);
结果:
ztime | quantity | ztime | quantity
--------------+----------+--------------+----------
10:01:01 | 100 | 10:01:01.001 | 50
10:01:01.001 | 50 | 10:01:01.002 | 0
10:01:01.002 | 0 | 10:01:01.003 | 100
10:01:01.003 | 100 | 10:01:03.001 | 100
10:01:03.001 | 100 | |
(5 rows)