首页 > 解决方案 > 如何使用分区并保持一致性

问题描述

在此处输入图像描述

我在 CALENDAR 表中有一个从 1982 年到今天的所有日期的数据集。表中的每条记录(日期)都表明它是否是工作日。我正在尝试对行进行编号,使其从 1 开始并连续遍历日期,但是当它到达一个不是工作日的日期时,它将收到与前一个日期相同的编号,并继续编号 -不分区并重新编号。这是我使用的代码:

SELECT t1.thedate,
        t1.working_day,
        Rank() Over(PARTITION BY Working_Day ORDER BY TheDate) AS test
FROM CAL t1
WHERE 1=1
ORDER BY 1

标签: sqlteradatawindow-functions

解决方案


不要使用 RANK,只需对 1/0 求和:

sum(case when Working_Day = 'Y' then 1 else 0 end)
over (ORDER BY TheDate
      rows unbounded preceding)

或者更短一点,计算非空行:

count(case when Working_Day = 'Y' then 1 end)
over (ORDER BY TheDate
      rows unbounded preceding)

推荐阅读