我有一个包含两列(数字和 id)的表,想要计算 value_needed 列。
列定义 - 将 8 替换为之前的数字 + 1。
但是通过使用简单的 LAG 函数,我收到了该输出:
数字 | id | 当前值 | 所需价值 |
---|---|---|---|
1 | 123 | 1 | 1 |
1 | 123 | 1 | 1 |
2 | 123 | 2 | 2 |
8 | 123 | 3 | 3 |
8 | 123 | 9 | 3 |
我需要实现 value_needed 列(所有 8 个列都有“3”作为输出)
我的代码:
CASE WHEN number = 8
THEN LAG(number) OVER (PARTITION BY (id) ORDER BY number) + 1
ELSE number
我需要在没有 WHERE 条件的 CASE 语句中定义它。我尝试添加分区时间的大小写,但它无法正常工作
给定您的数据和所需的输出,听起来 DENSE_RANK() 是您想要的聚合窗口函数:
DENSE_RANK() OVER (PARTITION BY id ORDER BY number)
使用示例数据的示例:
WITH cte AS (
SELECT 1 as num, 123 as id
UNION ALL SELECT 1, 123
UNION ALL SELECT 2, 123
UNION ALL SELECT 8, 123
UNION ALL SELECT 8, 123
)
SELECT num, id, DENSE_RANK() OVER (PARTITION BY id ORDER BY num) as value_needed
FROM cte
结果:
+-----+-----+--------------+
| num | id | value_needed |
+-----+-----+--------------+
| 1 | 123 | 1 |
| 1 | 123 | 1 |
| 2 | 123 | 2 |
| 8 | 123 | 3 |
| 8 | 123 | 3 |
+-----+-----+--------------+