我有这个查询:
select
sth.Id,
sth.CreatedDateTime,
EndDateTime = Lead(sth.CreatedDateTime, 1) over (partition by sth.Id order by sth.Id, sth.CreatedDateTime)
from
Sth as sth
order by
sth.Id, sth.CreatedDateTime
返回以下结果:
Id StartDateTime EndDate
--------------------------------------------------------------------
2746743 2019-11-20 14:35:05.5841266 NULL
2746744 2019-11-20 14:35:05.5841266 NULL
3 2018-06-25 23:35:12.2799952 2018-06-26 09:57:27.8943163
13 2018-06-26 09:57:27.8943163 2018-06-26 10:41:19.2973307
我被要求更新上面的查询,将具有Id=3
的行拆分为两行。
意思是:正如你所看到的,Id 3
的记录从23:35 and ends the **next day** at 09:57
开始
我需要它把这张唱片一分为二。
第一个应该来自23:35 -> 23:59
下面的应该来自00:00 -> 09:57
如果记录跨度超过一天。什么都不需要做此外,最终解决方案应该能够用于历史记录表超过300万行。
所以记录应该导致类似的结果
Id StartDateTime EndDateTime
3 2018-06-25 23:35:12.2799952 2018-06-25 23:59:59.000000
3 2018-06-26 00:00:00.0000000 2018-06-26 09:57:27.8943163
我希望这是有道理的!
所有其他记录都将产生类似的结果。有些记录不需要拆分。
问题中的结果集不能是指定查询的结果(每个id
的结束日期都有一个null
值(。因此,我将这个问题解释为处理结束日期存在且开始日期后一天的情况。
我只想使用横向连接:
with t as (
select sth.*, CreatedDateTime as StartDateTime,
Lead(sth.CreatedDateTime, 1) over (partition by sth.Id order by sth.Id, sth.CreatedDateTime) as EndDateTime
from Sth as sth
)
select t.id, v.*
from t cross apply
(values (startdatetime,
(case when datediff(day, startdatetime, enddatetime) = 1
then dateadd(second, -1, dateadd(day, 1, convert(datetime, convert(date, startdatetime))))
else enddatetime
end)
),
(dateadd(day, 1, convert(date, startdatetime)),
(case when datediff(day, startdatetime, enddatetime) = 1
then enddatetime
end)
)
) v(startdatetime, enddatetime)
where v.enddatetime is not null;
这是一个数据库<>不停摆弄