首页 > 解决方案 > Redshift SQL:添加和重置考虑日期和组的计数器

问题描述

假设我在下面有一张表格。我想要一个计数器来计算客户(有很多)在段 A 中的次数。如果客户在两个季度之间跳转到不同的段,则当客户跳回段时计数器将重置A. 我确信有很多方法可以做到这一点,但我就是想不通..请帮忙。谢谢!

Quarter    Segment    Customer    *Counter*
Q1 2018    A          A1          1
Q2 2018    A          A1          2
Q3 2018    A          A1          3
Q4 2018    B          A1          1
Q1 2019    B          A1          2
Q2 2019    A          A1          1
Q1 2020    A          A1          *1* I want 1 not 2 here because it's not consecutive

标签: sqlamazon-redshiftcounterwindow-functionslag

解决方案


这是一种差距和孤岛问题。您可以通过不同的行号来解决此问题。真正的问题是处理宿舍。但是字符串函数可以处理这个问题。

select quarter, customer, segment,
       row_number() over (partition by customer, segment, seqnum - seqnum_cs order by right(quarter, 4), left(quarter, 2)) as counter
from (select t.*,
             row_number() over (partition by customer order by right(quarter, 4), left(quarter, 2)) as seqnum,
             row_number() over (partition by customer, segment order by right(quarter, 4), left(quarter, 2)) as seqnum_cs
      from t
     ) t
order by customer, seqnum;

这里的关键思想是行号的差异定义了具有相同状态的客户的相邻行。可能有点难以理解为什么会这样。但是,如果您查看子查询的结果,您无疑会看到并理解为什么会这样。


推荐阅读