为 SQL 中的日期分配序号
Assigning sequential numbers to dates in SQL
我正在尝试将 SQL 中彼此相隔 30 天 window 的日期分桶。对于下面示例数据中的每个 ID 号,我如何分配一个桶号,每当相邻日期之间的间隔超过 30 天时,桶号就会增加 1?
示例数据:
create table dates_bucket (ID integer, DATE date);
insert into dates_bucket (ID, DATE)
values
('123', '2019-04-04'),
('123', '2019-04-06'),
('123', '2019-09-09'),
('123', '2019-09-10'),
('123', '2019-10-01'),
('123', '2019-11-30'),
('345', '2013-03-12'),
('345', '2013-05-23'),
('345', '2014-09-03'),
('345', '2019-10-23'),
('345', '2019-10-25');
我需要这样的输出:
ID DATE ROW_NUM
123 2019-04-04 1
123 2019-04-06 1
123 2019-09-09 2
123 2019-09-10 2
123 2019-10-01 2
123 2019-11-30 3
345 2013-03-12 1
345 2013-05-23 2
345 2014-09-03 3
345 2019-10-23 4
345 2019-10-25 4
如果相关,我在 Netezza 工作。
这是一个间隔和孤岛问题,其中孤岛是相邻的日期,其间间隔不到一个月。我建议 lag()
获取前一个日期,并且满足增加超过 30 天的差距的累积 sum()
:
select id, date,
sum(case when date <= lag_date + interval '30 day' then 0 else 1 end)
over(partition by id order by date) as grp
from (
select d.*,
lag(date) over(partition by id order by date) lag_date
from dates_buckets d
) d
我正在尝试将 SQL 中彼此相隔 30 天 window 的日期分桶。对于下面示例数据中的每个 ID 号,我如何分配一个桶号,每当相邻日期之间的间隔超过 30 天时,桶号就会增加 1?
示例数据:
create table dates_bucket (ID integer, DATE date);
insert into dates_bucket (ID, DATE)
values
('123', '2019-04-04'),
('123', '2019-04-06'),
('123', '2019-09-09'),
('123', '2019-09-10'),
('123', '2019-10-01'),
('123', '2019-11-30'),
('345', '2013-03-12'),
('345', '2013-05-23'),
('345', '2014-09-03'),
('345', '2019-10-23'),
('345', '2019-10-25');
我需要这样的输出:
ID DATE ROW_NUM
123 2019-04-04 1
123 2019-04-06 1
123 2019-09-09 2
123 2019-09-10 2
123 2019-10-01 2
123 2019-11-30 3
345 2013-03-12 1
345 2013-05-23 2
345 2014-09-03 3
345 2019-10-23 4
345 2019-10-25 4
如果相关,我在 Netezza 工作。
这是一个间隔和孤岛问题,其中孤岛是相邻的日期,其间间隔不到一个月。我建议 lag()
获取前一个日期,并且满足增加超过 30 天的差距的累积 sum()
:
select id, date,
sum(case when date <= lag_date + interval '30 day' then 0 else 1 end)
over(partition by id order by date) as grp
from (
select d.*,
lag(date) over(partition by id order by date) lag_date
from dates_buckets d
) d