SQL中DENSE_RANK能否统计随时间变化的非去重值变更次数?
可以通过SQL实现该需求
核心思路是利用**窗口函数LAG()**对比当前行与上一行的学分值,标记每一次学分的“新变化段”,最后统计这些标记的总数即可满足需求——非连续出现的相同学分会被重复计数。
实现步骤与示例代码
假设你的数据存储在表course_credits中,包含字段year(年份)、credits(学分)、course_id(课程ID),按年份排序后的数据如下:
| year | credits |
|---|---|
| 2018 | 5 |
| 2019 | 7.5 |
| 2020 | 6.5 |
| 2021 | 5 |
对应的SQL实现代码:
WITH credit_segments AS ( SELECT year, credits, -- 获取上一年的学分值 LAG(credits) OVER (ORDER BY year) AS prev_credits, -- 标记是否为新的学分段:第一行或当前学分与上一行不同则标记为1 CASE WHEN prev_credits IS NULL OR credits != prev_credits THEN 1 ELSE 0 END AS segment_flag FROM course_credits WHERE course_id = '目标课程ID' -- 指定要统计的课程 ) -- 统计所有标记的总和,即学分变化的次数 SELECT SUM(segment_flag) AS total_change_count FROM credit_segments;
逻辑说明
LAG(credits) OVER (ORDER BY year):按年份排序,获取当前行的上一行学分值,第一行没有上一行,结果为NULL。segment_flag标记:第一行默认算一个新段(标记1);每当前后学分值不同时,说明进入了一个新的连续学分段(标记1),否则标记0。- 对
segment_flag求和:得到的总数就是你需要的统计结果——上述示例的结果为4,完全符合你的需求。
兼容性说明
LAG()窗口函数在主流SQL数据库中均支持,包括MySQL 8.0+、PostgreSQL、SQL Server、Oracle等。
内容的提问来源于stack exchange,提问作者Jojo
相关产品推荐
相关产品推荐

