PostgreSQL中如何删除第4个列组合之后的所有行
解决方案
针对你的需求,我们可以通过子查询筛选前4个唯一季度组合的方式实现,兼容PostgreSQL 6.10且支持跨年场景:
完整SQL代码
-- 保留前4个最新(year, quarter)组合的所有行 SELECT grouped.* FROM ( -- 替换为你的原始分组查询 SELECT name, COUNT(*) AS count, quarter, year FROM original_data GROUP BY name, quarter, year ) grouped JOIN ( -- 获取排序后的前4个唯一季度组合 SELECT DISTINCT year, quarter FROM ( SELECT name, COUNT(*) AS count, quarter, year FROM original_data GROUP BY name, quarter, year ) temp ORDER BY year DESC, quarter DESC LIMIT 4 ) top_quarters ON grouped.year = top_quarters.year AND grouped.quarter = top_quarters.quarter -- 保持原排序逻辑 ORDER BY grouped.year DESC, grouped.quarter DESC, grouped.name;
逻辑说明
- 原始分组查询:内层第一个子查询是你原本的分组逻辑,生成包含
name、count、quarter、year的结果集。 - 筛选前4个季度组合:第二个子查询从分组结果中提取唯一的
(year, quarter)对,按year降序、quarter降序排序后取前4个——这会自动优先保留最新的季度(包括跨年场景,比如2023Q1会排在2022Q4之前)。 - 关联保留目标行:通过JOIN操作,只保留原始分组结果中属于这4个季度组合的行,最后按原排序规则输出。
适配跨年场景
当新的年度季度(如2023Q1)出现时,ORDER BY year DESC, quarter DESC会自动将其排在现有季度的最前面,LIMIT 4会自动替换掉最老的那个季度组合,无需修改代码。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

