在 SQL 中为日期分配序号

Posted

技术标签:

【中文标题】在 SQL 中为日期分配序号【英文标题】:Assigning sequential numbers to dates in SQL 【发布时间】:2020-12-13 23:35:52 【问题描述】:

我正在尝试在 SQL 中存储彼此相隔 30 天的日期。对于下面示例数据中的每个 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 工作。

【问题讨论】:

【参考方案1】:

这是一个间隙和岛屿问题,其中岛屿是相邻的日期,相隔不到一个月。我建议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 

【讨论】:

太棒了,谢谢!我认为 sum 可能会起作用,但不知道如何将这些部分组合在一起。

以上是关于在 SQL 中为日期分配序号的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中为给定年份设置硬编码的日期和月份

创建一个表,其中动态 PL/SQL 中的“日期条件”

如何在 Hive SQL 中为日期列执行 BETWEEN 运算符

如何在 SQL 中为不同月份运行不同的日期范围

如何在 sql server 2008R2/ssis 中为每个日期导出带有日期时间的单独 excel 表?

如何在 BigQuery SQL 中为与按日期排序的主 ID 关联的子 ID 编号?