获取日期序列中所有缺失的日期

Posted

技术标签:

【中文标题】获取日期序列中所有缺失的日期【英文标题】:Get all the missing dates in a sequence of dates 【发布时间】:2016-10-03 21:49:34 【问题描述】:

我正在尝试按升序排列日期序列中的所有缺失日期。如何在不使用任何函数或 udfs 的情况下使用简单的 sql 来完成。

Input :-

2016-09-01
2016-09-02
2016-09-05
2016-09-10

输出:-

2016-09-03
2016-09-04
2016-09-06
2016-09-07
2016-09-08
2016-09-09

我尝试了什么?

  select start, stop 
    from
       (
          select m.x + 1 as start,
                 (select min(x) - 1 from X as x where x.x > m.x) as stop
            from X as m
           left outer join X as r
              on m.x = r.x - 1
           where r.x is null
        ) as x
  where stop is not null;

【问题讨论】:

如果您标记正在使用的 dbms 并显示您的尝试,这将有所帮助。 我正在尝试使用整数解决它,然后跳转到日期。 你的数据库支持递归公用表表达式吗? 支持 CTE 对我来说似乎没有错过日期 【参考方案1】:

    创建一个新表并插入编号为 1-365 的 365 行 (或者使用已经超过 365 行的表,并使用 rownum 或类似构造来获取唯一整数)

    将日期转换为整数(在 Oracle 中使用 TO_CHAR( mydate, 'ddd' ) 之类的东西)

    在您的查询中将这两个列表连接在一起,以找到合适的集合(重叠、缺失等)

    转换回日期

【讨论】:

我正在使用亚马逊红移 @Teja 我不明白 Amazon Redshift 是否支持 cte。 Amazon Redshift 不支持递归 ctes。检查此链接。 docs.aws.amazon.com/redshift/latest/dg/… 这个答案对我没有帮助兰迪:( 好的 - 抱歉 - 这是您用来避免 CTE 的模式 - 您需要另一个包含所有日期的表格来进行比较 - 整数是最好的选择。

以上是关于获取日期序列中所有缺失的日期的主要内容,如果未能解决你的问题,请参考以下文章

从 Redshift 中的表中获取缺失的日期

在 MongoDB 聚合中添加缺失的日期

R:在时间序列中填充缺失的日期?

如何从日期范围查询中查找表中的一组缺失日期

将缺失的日期添加到时间序列数据框

Python pandas:在groupby数据框中插入缺失日期、时间序列的行