sql - 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
解决方案
这是一种差距和孤岛问题。您可以通过不同的行号来解决此问题。真正的问题是处理宿舍。但是字符串函数可以处理这个问题。
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;
这里的关键思想是行号的差异定义了具有相同状态的客户的相邻行。可能有点难以理解为什么会这样。但是,如果您查看子查询的结果,您无疑会看到并理解为什么会这样。
推荐阅读
- django - React.js 和 Django S3 上传困境 403/签名不匹配
- regex - 正则表达式检测特定单词
- elasticsearch - 插件无法在 ElasticSearch 中使用 FileBeat
- c++ - 使 OpenCV 调整大小与 Matlab/Octave imresize 相同
- android - 在android studio中启动错误
- oracle - Oracle 存储过程将返回表中的所有数据
- python - 解析使用 Flask-Caching 存储的字节
- python-3.x - 具有多个 groupby 的特定值的唯一列值的数值聚合
- lambda - CognitoIdentityCredentials 无权访问此资源
- android-gradle-plugin - 在项目':app'中找不到路径'unzipJacocoAgent'的任务