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

SQL按分组年份数量选取对应年份数据问题求助

SQL分组年份筛选解决方案

首先纠正你之前的问题:你用row_number() over (partition by "Group","Year")生成的行号没实际作用——它会把每个分组下的同一年份数据单独拆成组,每个组的行号都是1,没法帮你实现按年份数量筛选的需求。

下面给两种实用的写法,按需选择:

方法一:用CTE分步处理(更直观,适合新手理解)

WITH group_year_stats AS (
    -- 先统计每个分组的年份总数和最大年份
    SELECT 
        "Group",
        COUNT(DISTINCT "Year") AS year_count,
        MAX("Year") AS max_year
    FROM your_table  -- 替换成你的实际表名
    GROUP BY "Group"
),
target_years AS (
    -- 根据年份总数确定要筛选的目标年份
    SELECT 
        "Group",
        CASE 
            WHEN year_count = 3 THEN max_year - 1
            WHEN year_count = 2 THEN max_year
            -- 如果分组年份数不是2或3,可在此添加默认逻辑,比如保留最大年份/过滤掉该分组
        END AS target_year
    FROM group_year_stats
)
-- 关联原表和目标年份表,筛选符合条件的数据
SELECT t.*
FROM your_table t
JOIN target_years ty 
    ON t."Group" = ty."Group" 
    AND t."Year" = ty.target_year;

方法二:用窗口函数一步完成(更简洁)

SELECT *
FROM (
    SELECT 
        *,
        -- 窗口函数计算每个分组的年份总数和最大年份
        COUNT(DISTINCT "Year") OVER (PARTITION BY "Group") AS year_count,
        MAX("Year") OVER (PARTITION BY "Group") AS max_year,
        -- 直接算出当前行所属分组的目标年份
        CASE 
            WHEN COUNT(DISTINCT "Year") OVER (PARTITION BY "Group") = 3 THEN MAX("Year") OVER (PARTITION BY "Group") - 1
            WHEN COUNT(DISTINCT "Year") OVER (PARTITION BY "Group") = 2 THEN MAX("Year") OVER (PARTITION BY "Group")
        END AS target_year
    FROM your_table  -- 替换成你的实际表名
) sub_query
-- 只保留年份等于目标年份的行
WHERE "Year" = target_year;

关键说明:

  • 用COUNT(DISTINCT "Year")是为了统计每个分组里的不同年份数量,避免同一年份有多条数据干扰统计结果。
  • 两种写法核心逻辑一致:先确定每个分组的目标年份,再筛选对应数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:27:14