SQL Server T-SQL,DATETIME列表,从中创建< from>< to>

myzjeezk  于 2023-01-12  发布在  其他
关注(0)|答案(2)|浏览(129)

我需要做些什么来实现以下目标?不知何故,我似乎找不到一个好的解决方案。
我有几个CTE,最后一个只生成DATETIME值的列表,带有行号列,这些值按DATETIME排序。
例如

rn  datetime
---------------------------
1   2023-01-07 01:00:00.000
2   2023-01-08 05:30:00.000
3   2023-01-08 08:00:00.000
4   2023-01-09 21:30:00.000

我必须如何将此CTE相互连接才能获得以下结果:

from                        to
---------------------------------------------------
2023-01-07 01:00:00.000     2023-01-08 05:30:00.000
2023-01-08 08:00:00.000     2023-01-09 21:30:00.000

执行常规内部连接(使用t1.rn = t2.rn - 1)会多出一行(从05:30到08:00的那一行),所以基本上每个日期只能“使用”一次。
希望这是有道理的...谢谢!
内部将CTE与其自身联接,这没有返回所需的结果。

edqdpe6u

edqdpe6u1#

您可以透视CTE的结果并使用以下算法分配行:想到模2。
假设CTE返回列dt(日期时间字段)和rn(整数行号):

select min(dt) dt_from, max(dt) dt_to
from cte 
group by ( rn - 1 ) % 2

在T-SQL上,我们还可以利用整数除法来表示对分组:

group by ( rn - 1 ) / 2
f4t66c6m

f4t66c6m2#

通过使用LAG检索结果集中的前一列值,可以避免JOIN和GROUP BY。服务器可以生成一个执行计划,该计划只对数据进行一次迭代,而不是进行联接或分组:

with pairs as (
    SELECT rn, lag(datetime) OVER(ORDER BY rn) as dt_from, datetime as dt_to
    from another_cte        
)
select dt_from,dt_to
from pairs
ORDER BY rn
where rn%2=0

行号本身可以从datetime计算:

with pairs as (
    SELECT 
        ROW_NUMBER() OVER(ORDER BY datetime) AS rn,
        lag(datetime) OVER(ORDER BY datetime) as dt_from, 
        datetime as dt_to
    from another_cte  
)
select dt_from,dt_to
from pairs
ORDER BY dt_to
where rn%2=0

相关问题