【问题标题】:SQL: Getting the min date of a series of dates partitioning by if previous date is more than 1 day agoSQL:获取一系列日期的最小日期,如果前一个日期超过 1 天前
【发布时间】:2018-03-21 00:56:09
【问题描述】:

我每周都会进行一次数据导入,从开始时会持续几天。因此,在日期列中,每个数据导入都有多个日期。我想获得每次导入的最短日期。这在 SQL 中可能吗?具体来说,在 Google BigQuery 中。示例:

date    desired_output
4/25/17 4/25/17
4/26/17 4/25/17
4/27/17 4/25/17
5/2/17  5/2/17
5/3/17  5/2/17
5/10/17 5/10/17
5/16/17 5/16/17
5/17/17 5/16/17
5/23/17 5/23/17
5/24/17 5/23/17
5/30/17 5/30/17
5/31/17 5/30/17
6/5/17  6/5/17
6/6/17  6/6/17

【问题讨论】:

  • 您是否有任何字段可以识别属于同一导入的行?还是整个表是一个导入?
  • 不幸的是,我没有。展望未来,我们将添加此字段,但我想对历史数据进行一些分析,而无需手动重命名日期。
  • 那么您打算如何区分不同的进口产品?你应该为此提供一些逻辑。并展示一些具有预期输出的简化数据示例。只要你有它就应该超级简单
  • 哦,我完全错过了 - 你在帖子标题中有逻辑

标签: sql google-bigquery window-functions


【解决方案1】:

您可以识别按顺序排列的日期组——这是一个空白和孤岛问题。也许这会做你想要的:

select date,
       min(date) over (partition by date_add(date, interval - seqnum_d day)) as desired_output
from (select t.*,
             dense_rank() over (order by date) as seqnum_d
      from t
     ) t

日期算术通过减去一个序列来识别日期序列——瞧!结果是一个常数。

注意:这假设日期序列有间隔。

另外,我使用了dense_rank(),所以它可以在一个日期处理多个条目。

【讨论】:

    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 2017-05-11
    • 2015-06-04
    • 1970-01-01
    • 2021-12-01
    • 2017-06-29
    • 1970-01-01
    相关资源
    最近更新 更多