【发布时间】:2025-12-20 23:20:08
【问题描述】:
我正在尝试计算一个对连续空值执行运行计数的列,但运行计数将在非空值时重置。
我目前正在尝试在这个版本的 redshift 上实现这一点:
i686-pc-linux-gnu 上的 PostgreSQL 8.0.2,由 GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)、Redshift 1.0.8187 编译
我尝试使用这个窗口函数,但这只是不断增加每个 null 的数字。
ROW_NUMBER() OVER (PARTITION BY ID, VAL ORDER BY VAL ROWS UNBOUNDED PRECEDING)
例如,如果我有这样的数据集:
id | date | val
----+-------+-------
1 | 1/1 | NULL
1 | 1/2 | NULL
1 | 1/3 | NULL
1 | 1/4 | 1
1 | 1/5 | NULL
1 | 1/6 | NULL
1 | 1/7 | 1
2 | 1/8 | 2
2 | 1/9 | NULL
2 | 1/1 | NULL
2 | 1/2 | 1
2 | 1/3 | NULL
2 | 1/4 | 0
2 | 1/5 | NULL
2 | 1/6 | NULL
我希望输出如下所示:
id | date | val | foo
----+-------+-------+-------
1 | 1/1 | NULL | 1
1 | 1/2 | NULL | 2
1 | 1/3 | NULL | 3
1 | 1/4 | 1 |
1 | 1/5 | NULL | 1
1 | 1/6 | NULL | 2
1 | 1/7 | 1 |
2 | 1/8 | 2 |
2 | 1/9 | NULL | 1
2 | 1/1 | NULL | 2
2 | 1/2 | 1 |
2 | 1/3 | NULL | 1
2 | 1/4 | 0 |
2 | 1/5 | NULL | 1
2 | 1/6 | NULL | 2
【问题讨论】:
-
你完整的 SQL 是什么?
-
这是模拟数据吗?您提供的数据没有为运行 sum 提供足够的不同值来生成输出,您只能得到带有 id、val 组合的运行 sum 和上述示例数据
-
这确实是模型数据。我的数据集中确实有其他字段,但它们都是交易数据,我不知道它们是否可以用作分区,即 LTV、支出速度等。
-
我玩了一下,得出了 id、val 组合的运行总和。总和列像这样 1,2,3,0,4,5,0,1,0,2... 因为 IMO 无法使用上述输入创建输出。使用
sum(case when val = 'NULL' then 1 else 0 end) over (partition by id,val order by id,val,date rows between unbounded preceding and current row) as foo -
很高兴知道这一点。要使上述输出成为可能,还需要什么额外的东西?
标签: sql count amazon-redshift gaps-and-islands date-arithmetic