Crossjoin但只选择第一个

时间:2013-01-13 15:02:16

标签: sql sql-server sql-server-2012

我有一个以下格式的表格:

    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列。所以,我正在寻找有效的东西。

3 个答案:

答案 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)