【问题标题】: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
  • 对我来说似乎没有错过日期

标签: sql amazon-redshift paraccel


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

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

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

  4. 转换回日期

【讨论】:

  • 我正在使用亚马逊红移
  • @Teja 我不明白 Amazon Redshift 是否支持 cte。
  • Amazon Redshift 不支持递归 ctes。检查此链接。 docs.aws.amazon.com/redshift/latest/dg/…
  • 这个答案对我没有帮助兰迪:(
  • 好的 - 抱歉 - 这是您用来避免 CTE 的模式 - 您需要另一个包含所有日期的表格来进行比较 - 整数是最好的选择。
猜你喜欢
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 2021-09-14
相关资源
最近更新 更多