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

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ş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 12:25:19