SQL查询求助:如何筛选DE国家各文档的唯一最新版本
筛选DE国各文档最新版本的SQL查询方案
数据表结构与数据
id | document_name | country | major_version | minor_version ---|---------------|---------|---------------|--------------- 1 | policy1 | DE | 1 | 0 2 | policy2 | DE | 1 | 0 3 | policy1 | DE | 1 | 1 4 | policy1 | DE | 2 | 0 5 | policy2 | DE | 1 | 1 6 | policy2 | IT | 1 | 0 7 | policy2 | IT | 1 | 1
需求
仅返回country为'DE'的每个文档的最新版本记录,版本判断逻辑:优先比较major_version(数值越大越新),major_version相同时比较minor_version(数值越大越新),预期结果如下:
id | document_name | country | major_version | minor_version ---|---------------|---------|---------------|--------------- 4 | policy1 | DE | 2 | 0 5 | policy2 | DE | 1 | 1
解决方案
方案1:PostgreSQL专属(修正DISTINCT ON用法)
你之前用DISTINCT ON未得到正确结果,是因为没指定按版本从新到旧排序。DISTINCT ON会保留每个分组的第一条记录,所以需要先对版本降序排列:
SELECT DISTINCT ON (document_name) id, document_name, country, major_version, minor_version FROM your_table_name WHERE country = 'DE' ORDER BY document_name, major_version DESC, minor_version DESC;
- 逻辑:先筛选出DE的记录,按
document_name分组,每组内先按major_version降序、再按minor_version降序排列,DISTINCT ON保留每组的第一条(即最新版本)。
方案2:通用SQL(窗口函数法,适用于MySQL 8.0+、SQL Server、Oracle等)
如果你的数据库支持窗口函数,这个方法兼容性更强:
SELECT id, document_name, country, major_version, minor_version FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY document_name ORDER BY major_version DESC, minor_version DESC ) AS rn FROM your_table_name WHERE country = 'DE' ) AS sub WHERE rn = 1;
- 逻辑:子查询给每个
document_name分组的记录按版本降序编号(最新版本编号为1),外层查询只取编号为1的记录。
方案3:子查询关联法(兼容所有SQL版本)
若数据库不支持窗口函数,可通过子查询找到每个文档的最大版本组合,再关联原表获取完整记录:
SELECT t.id, t.document_name, t.country, t.major_version, t.minor_version FROM your_table_name t INNER JOIN ( SELECT document_name, MAX(major_version) AS max_major, MAX(minor_version) FILTER (WHERE major_version = MAX(major_version)) AS max_minor FROM your_table_name WHERE country = 'DE' GROUP BY document_name ) AS latest ON t.document_name = latest.document_name AND t.major_version = latest.max_major AND t.minor_version = latest.max_minor WHERE t.country = 'DE';
- 逻辑:子查询先找出每个DE文档的最大
major_version,再找出该major_version对应的最大minor_version,最后关联原表匹配这些版本组合的记录。
内容的提问来源于stack exchange,提问作者Yiğit Güneş
相关产品推荐
相关产品推荐

