Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 交叉连接,但仅选择第一个_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql 交叉连接,但仅选择第一个

Sql 交叉连接,但仅选择第一个,sql,sql-server,sql-server-2012,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

我有以下格式的表格:

    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列。因此,我正在寻找一些有效的方法。

如果时间是独一无二的,这会让你走得更远:

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
    );
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)

如果时间是独一无二的,这会让你前进:

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)
当您使用SQL Server 2012时,您可以使用

当您使用SQL Server 2012时,您可以使用



SQL Server?哪个版本?2012版有滞后和超前功能,这使它更容易实现。RowNumber是表中的实际列吗?如果是,是否保证连续?如果是这样,怎么办?注意:标识列不是唯一的,还有一个问题:时间列是唯一的,或者同一时间可以有两行或多行,在这种情况下会发生什么,如何解决顺序?这是Microsoft SQL server 2012。我删除了上面的行号。你能给我写一个小样本代码吗。谢谢@JW-你要取消删除你的答案吗?您只需将按[RowNumber]排序的订单更改为按[Time]排序的订单即可?SQL Server?哪个版本?2012版有滞后和超前功能,这使它更容易实现。RowNumber是表中的实际列吗?如果是,是否保证连续?如果是这样,怎么办?注意:标识列不是唯一的,还有一个问题:时间列是唯一的,或者同一时间可以有两行或多行,在这种情况下会发生什么,如何解决顺序?这是Microsoft SQL server 2012。我删除了上面的行号。你能给我写一个小样本代码吗。谢谢@JW-你要取消删除你的答案吗?您只需将[RowNumber]下的订单更改为[Time]下的订单即可。当然,谢谢您的帮助。可能会提到使用lead函数,但我认为使用lead无法在OP中获得所需的行。我说的对吗?哦,同样的解决方案,但是你更快了@user1949158你试过马丁的答案了吗?我认为从语义上讲,使用LEAD更好,但我不确定这对LEAD有何影响,但我假设如果你的时间列上有索引,它应该相同或更快。@Bulat你建议使用哪种索引。请注意,我使用的是Microsoft SQL Server 2012。我确实试过Martin的解决方案是为了好玩,但因为他说他对效率不确定,所以我没有在我的主表中实现它。而且Martin的解决方案也不能帮助我找到下一次,因为我的表中有很多重复项。谢谢,我会尝试一下。可能会提到使用lead函数,但我认为使用lead无法在OP中获得所需的行。我说的对吗?哦,同样的解决方案,但是你更快了@user1949158你试过马丁的答案了吗?我认为从语义上讲,使用LEAD更好,但我不确定这对LEAD有何影响,但我假设如果你的时间列上有索引,它应该相同或更快。@Bulat你建议使用哪种索引。请注意,我使用的是Microsoft SQL Server 2012。我确实试过Martin的解决方案是为了好玩,但因为他说他不确定效率,所以我没有在我的主表中实现它。而且Martin的解决方案也不能帮助我找到下一次,因为我的表中有很多重复项。+1我删除了它,因为如果我问42m行的查询效率,我无法支持我的答案。hehe@Martin:及时包含数量的索引很有用,你不认为吗?@ypercube-是的,这样可以避免任何排序。或者,如果OP希望在输出中包含更多列,则使用时间作为CI。+1我删除了它,因为如果我询问42m行的查询效率,我无法支持我的答案。hehe@Martin:在Time INCLUDE Quantity上建立索引会很有用,你不认为吗?@ypercube-是的,这样可以避免任何排序。或者,如果OP希望输出中有更多列,则使用时间作为CI。抱歉@Bulat我不接受答案,因为它不适用于我的4200万行。我仍在想是否有更好的办法。我现在能看到的唯一选项是在.CSV中下载数据并使用C++。我的问题是时间不是唯一的,所以我不能使用铅。LEAD不能保证加入下一个或更高的时间。抱歉@Bulat我无法接受答案,因为它无法处理我的4200万行。我仍在想是否有更好的办法。我现在能看到的唯一选项是在.CSV中下载数据并使用C++。我的问题是时间不是唯一的,所以我不能使用铅。LEAD不保证加入下一个或更高的时间。
SELECT  a.Time,
        a.Quantity,
        LEAD(Time) OVER (ORDER BY Time) Time2,
        LEAD(Quantity) OVER (ORDER BY Time) Quantity2
FROM    tableName a