如何找到两个日期之间的连续天数

时间:2020-04-04 16:45:45

标签: sql group-by amazon-redshift gaps-and-islands

我有如图所示的情况,其中某项商品的供应日期不会持续。我想找出每当它可用时,它会在网站中持续保留多长时间。

我想为我的表中的每个项目查找以下内容: enter image description here

Sample

1 个答案:

答案 0 :(得分:1)

这是一个典型的缺口和孤岛问题。

这是使用窗口函数的一种方法:

select 
    item, 
    min(available_date) min_available_date, 
    max(available_date) max_available_date, 
    count(*) no_days
from (
    select 
        t.*, 
        sum(case when available_date = lag_available_date + interval '1' day then 0 else 1 end) 
            over(
                partition by item 
                order by available_date
                rows between unbounded preceding and current row
            ) grp
    from (
        select 
            t.*, 
            lag(available_date) 
                over(partition by item order by available_date) lag_available_date
        from mytable t
    ) t
) t
group by item, grp
order by item, min_available_date

最内部的查询将恢复“上一个”记录的日期。下一级执行的窗口总和在每次日期不连续时都会增加1:这定义了组。然后,外部查询按组聚合。

Demo on DB Fiddle

样本数据:

item | available_date
:--- | :-------------
ABA  | 2019-01-04    
ABA  | 2019-01-05    
ABA  | 2019-01-06    
ABA  | 2019-01-07    
ABA  | 2019-01-12    
ABA  | 2019-01-15    
ABA  | 2019-01-16    
ABA  | 2019-01-17    
ABA  | 2019-01-19    
ABA  | 2019-01-21    
ABA  | 2019-01-22    

查询结果:

item | min_available_date | max_available_date | no_days
:--- | :----------------- | :----------------- | ------:
ABA  | 2019-01-04         | 2019-01-07         |       4
ABA  | 2019-01-12         | 2019-01-12         |       1
ABA  | 2019-01-15         | 2019-01-17         |       3
ABA  | 2019-01-19         | 2019-01-19         |       1
ABA  | 2019-01-21         | 2019-01-22         |       2