在 SQL 服务器中制作日期组
Making groups of dates in SQL Server
我有一个 table 包含 ID 和日期,我想为每个 ID 分组日期
id date
------------------
1 2019-01-01
2 2019-01-01
1 2019-01-02
2 2019-01-02
2 2019-01-03
1 2019-01-04
1 2019-01-05
2 2019-01-05
2 2019-01-06
我想检查每个 ID 的日期差距在哪里,以获得类似
的输出
id from to
------------------------------------
1 2019-01-01 2019-01-02
1 2019-01-04 2019-01-05
2 2019-01-01 2019-01-03
2 2019-01-05 2019-01-06
这是一种缺口孤岛问题。最简单的解决方案是为每个 id 生成一个序列号,然后从日期中减去它。对于连续的日期,这是常量。
所以:
select id, min(date), max(date)
from (select t.*, row_number() over (partition by id order by date) as seqnum
from t
) t
group by id, dateadd(day, -seqnum, date)
order by id, min(date);
Here 是一个 db<>fiddle.
解决此间隙和孤岛问题的典型方法是通过将当前记录的 date
与相同 [=13] 的 "previous" date
进行比较来构建组=].当日期不连续时,新组开始:
select id, min(date) from_date, max(date) to_date
from (
select
t.*,
sum(case when date = dateadd(day, 1, lag_date) then 0 else 1 end)
over(partition by id order by date) grp
from (
select
t.*,
lag(date) over(partition by id order by date) lag_date
from mytable t
) t
) t
group by id, grp
order by id, from_date
我有一个 table 包含 ID 和日期,我想为每个 ID 分组日期
id date
------------------
1 2019-01-01
2 2019-01-01
1 2019-01-02
2 2019-01-02
2 2019-01-03
1 2019-01-04
1 2019-01-05
2 2019-01-05
2 2019-01-06
我想检查每个 ID 的日期差距在哪里,以获得类似
的输出id from to
------------------------------------
1 2019-01-01 2019-01-02
1 2019-01-04 2019-01-05
2 2019-01-01 2019-01-03
2 2019-01-05 2019-01-06
这是一种缺口孤岛问题。最简单的解决方案是为每个 id 生成一个序列号,然后从日期中减去它。对于连续的日期,这是常量。
所以:
select id, min(date), max(date)
from (select t.*, row_number() over (partition by id order by date) as seqnum
from t
) t
group by id, dateadd(day, -seqnum, date)
order by id, min(date);
Here 是一个 db<>fiddle.
解决此间隙和孤岛问题的典型方法是通过将当前记录的 date
与相同 [=13] 的 "previous" date
进行比较来构建组=].当日期不连续时,新组开始:
select id, min(date) from_date, max(date) to_date
from (
select
t.*,
sum(case when date = dateadd(day, 1, lag_date) then 0 else 1 end)
over(partition by id order by date) grp
from (
select
t.*,
lag(date) over(partition by id order by date) lag_date
from mytable t
) t
) t
group by id, grp
order by id, from_date