【问题标题】:Identify missing hours - find the gaps in time确定错过的时间 - 找到时间差距
【发布时间】:2021-04-25 14:39:40
【问题描述】:

我有一张有小时数的表,但有间隔。我需要找出缺少的时间。

select datehour
from stored_hours
order by 1;

这个时间线的差距很容易找到:

select lag(datehour) over(order by datehour) since, datehour until
  , timestampdiff(hour, lag(datehour) over(order by datehour), datehour) - 1 missing
from stored_hours
qualify missing > 0

如何创建这些天的缺失时间列表?

(使用 Snowflake 和 SQL)

【问题讨论】:

    标签: sql time-series timestamp snowflake-cloud-data-platform


    【解决方案1】:

    创建缺课时间的列表/表格:

    • 生成现有表的最小值/最大值之间的所有小时的列表。
    • 要使用 Snowflake 生成该列表,您需要使用会话变量(因为生成器只接受长度常量。
    • 然后用左连接查找缺失的小时数,寻找空值。

    使用变量找出开始和总小时数:

    set (min_hour, total_hours) = (
        select min(datehour) min_hour
            , timestampdiff('hour', min(datehour), max(datehour)) total_hours
        from stored_hours
    );
    

    然后对生成的所有小时表进行左连接,以找到丢失的表:

    select generated_hour missing_hour
    from ( -- generated hours
        select timestampadd('hour', row_number() over(order by 0), $min_hour) generated_hour
        from table(generator(rowcount => $total_hours))
    ) a
    left outer join stored_hours b
    on generated_hour=b.datehour
    where datehour is null;
    

    结果是缺失时间的列表:

    (如果输入是日期,您可以对缺失的日期应用类似的技术)

    【讨论】:

      猜你喜欢
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-19
      相关资源
      最近更新 更多