You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中DENSE_RANK能否统计随时间变化的非去重值变更次数?

可以通过SQL实现该需求

核心思路是利用**窗口函数LAG()**对比当前行与上一行的学分值,标记每一次学分的“新变化段”,最后统计这些标记的总数即可满足需求——非连续出现的相同学分会被重复计数。

实现步骤与示例代码

假设你的数据存储在表course_credits中,包含字段year(年份)、credits(学分)、course_id(课程ID),按年份排序后的数据如下:

yearcredits
20185
20197.5
20206.5
20215

对应的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;

逻辑说明

  1. LAG(credits) OVER (ORDER BY year):按年份排序,获取当前行的上一行学分值,第一行没有上一行,结果为NULL。
  2. segment_flag标记:第一行默认算一个新段(标记1);每当前后学分值不同时,说明进入了一个新的连续学分段(标记1),否则标记0。
  3. 对segment_flag求和:得到的总数就是你需要的统计结果——上述示例的结果为4,完全符合你的需求。

兼容性说明

LAG()窗口函数在主流SQL数据库中均支持,包括MySQL 8.0+、PostgreSQL、SQL Server、Oracle等。

内容的提问来源于stack exchange,提问作者Jojo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:55:09