使用分区的最早日期来确定该分区还有哪些其他日期

时间:2019-07-25 19:29:51

标签: sql snowflake

假设这是我的桌子:

ID  DATE
--------------
1   2018-11-12 
2   2018-11-13
3   2018-11-14
4   2018-11-15
5   2018-11-16
6   2019-03-05
7   2019-05-07
8   2019-05-08
9   2019-05-08

我需要根据分区中的第一个日期确定分区。第一个日期后2天内的任何日期都属于同一分区。

如果对每个分区进行排名,则表最终将看起来像这样

PARTITION ID  DATE
------------------------
1         1   2018-11-12 
1         2   2018-11-13
1         3   2018-11-14
2         4   2018-11-15
2         5   2018-11-16
3         6   2019-03-05
4         7   2019-05-07
4         8   2019-05-08
4         9   2019-05-08

我尝试使用带有滞后的datediff与前一个日期进行比较,但这将使分区的大小基于间距而不合适,例如,所有这些日期都将包含在同一分区中:

ID  DATE
--------------
1   2018-11-12 
2   2018-11-14
3   2018-11-16
4   2018-11-18
3   2018-11-20
4   2018-11-22

先前的错误尝试:

在日期比上一个日期晚2天以上时标记:

(case when datediff(day, lag(event_time, 1) over (partition by user_id, stage order by event_time), event_time) > 2 then 1 else 0 end)

1 个答案:

答案 0 :(得分:0)

您需要为此使用递归CTE,因此操作成本很高。

with t as (
      -- add an incrementing column with no gaps
      select t.*, row_number() over (order by date) as seqnum
      from t
     ),
     cte as (
      select id, date, date as mindate, seqnum
      from t
      where seqnum = 1
      union all
      select t.id, t.date,
             (case when t.date <= dateadd(day, 2, cte.mindate)
                   then cte.mindate else t.date
              end) as mindate,
             t.seqnum
      from cte join
           t
           on t.seqnum = cte.seqnum + 1
    )
select cte.*, dense_rank() over (partition by mindate) as partition_num
from cte;