如果中间有其他日期,则使用单独的组分组日期范围

Posted

技术标签:

【中文标题】如果中间有其他日期,则使用单独的组分组日期范围【英文标题】:Group Date ranges with separate groups if other date in between 【发布时间】:2020-10-21 08:30:45 【问题描述】:

我有一个这样的表:

Specification    Date 
ADS              2020-09-04 00:00:00.000
ADS              2020-09-05 00:00:00.000
ADS              2020-09-06 00:00:00.000
AZR              2020-09-07 00:00:00.000
AZR              2020-09-08 00:00:00.000
ADS              2020-09-09 00:00:00.000
ADS              2020-09-10 00:00:00.000

我想选择一个开始日期和一个结束日期,并按规范对它们进行分组。 所以我的输出应该是这样的:

Specification    Start                     End
ADS              2020-09-04 00:00:00.000   2020-09-06 00:00:00.000
AZR              2020-09-07 00:00:00.000   2020-09-08 00:00:00.000
ADS              2020-09-09 00:00:00.000   2020-09-10 00:00:00.000

我试过了:

select
Specification, MIN(Date) as Start, MAX(Date) as End
from CUSTOMERS
group by Specification 

但这并没有给出我想要的结果。有人有想法吗?

【问题讨论】:

对这些数据运行查询的结果是什么? 【参考方案1】:

您可以尝试以下方法 - 这是一个差距和孤岛问题

select col1, min(dateval) as start, max(dateval) as end
from
(
select *,row_number() over(order by dateval)-
row_number() over(partition by col1 order by dateval) as grp
from t
)A group by col1, grp

【讨论】:

效果很好!并感谢您指出这是一个差距和孤岛问题。

以上是关于如果中间有其他日期,则使用单独的组分组日期范围的主要内容,如果未能解决你的问题,请参考以下文章

Postgres约束唯一的日期时间范围

t-sql 从平面日期列表中总结日期范围,按其他列分组

在mysql和php中按日期范围分组

使用熊猫按日期范围分组

Sqlite,使用分组?对于具有日期范围的子查询

MDX 查询以对具有特定日期范围的日期维度进行分组