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
相关产品推荐
相关产品推荐

