sql - 计算连续的 TRUE 值并在单独的列中显示为 TRUE 值的计数
问题描述
雪花表中的样本数据:
| EMAIL | Date | EmailClicked|
| -------- | -------------- | -------- |
| abc@gmail.com| 01-01-2021| TRUE |
| abc@gmail.com| 02-01-2021| FALSE|
| def@gmail.com| 02-01-2021| FALSE|
| abc@gmail.com| 03-01-2021| TRUE |
| abc@gmail.com| 04-01-2021| TRUE |
| abc@gmail.com| 05-01-2021| TRUE |
| def@gmail.com| 03-01-2021| TRUE|
| def@gmail.com| 06-01-2021| FALSE|
| abc@gmail.com| 06-01-2021| FALSE|
| abc@gmail.com| 07-01-2021| TRUE |
| abc@gmail.com| 08-01-2021| TRUE |
输出预期将连续的真值显示为另一列
| EMAIL | Date | EmailClicked| Consecutivecount |
| -------- | -------------- | -------- | -------- |
| abc@gmail.com| 01-01-2021| TRUE | 1 |
| abc@gmail.com| 02-01-2021| FALSE| 0 |
| abc@gmail.com| 03-01-2021| TRUE | 1 |
| abc@gmail.com| 04-01-2021| TRUE | 2 |
| abc@gmail.com| 05-01-2021| TRUE | 3 |
| abc@gmail.com| 06-01-2021| FALSE| 0 |
| abc@gmail.com| 07-01-2021| TRUE | 1 |
| abc@gmail.com| 08-01-2021| TRUE | 2 |
| def@gmail.com| 02-01-2021| FALSE| 0 |
| def@gmail.com| 03-01-2021| TRUE| 1 |
| def@gmail.com| 06-01-2021| FALSE| 0 |
解决方案
这是一个间隙和孤岛问题,一种方法使用行数差异方法:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY Date) rn1,
ROW_NUMBER() OVER (PARTITION BY EMAIL, EmailClicked ORDER BY Date) rn2
FROM yourTable
)
SELECT EMAIL, Date, EmailClicked,
EmailClicked::int * ROW_NUMBER() OVER (PARTITION BY EMAIL, EmailClicked, rn1-rn2
ORDER BY Date) AS Consecutivecount
FROM cte
ORDER BY EMAIL, Date;
演示
推荐阅读
- servicenow - UiPath - 无法插入 ServiceNow 表记录:System.AggregateException
- for-loop - 具有两个嵌套 for 循环的递归函数的时间复杂度
- sql - SQL Server:where条件中最小的ROW_NUM,带有子组前置条件
- python - 创建一个表,其中一列作为行,另一列作为列
- c# - WebView2 记录 http 流量(入站和出站)
- php - 获取 lat/long + range 中的所有配置文件(laravel - laravel-mysql-spatial)
- python - Pandas 将三个变量分组并计算均值、众数和中位数
- c - 在下面的示例中,运算符 ++ 后跟 -> 的工作
- swiftui - SwiftUI 导航栏隐藏不起作用
- java - 列表中的子字符串