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

如何从数据库CODE列获取唯一值及对应关联数据?

解决CODE列取唯一值并对应其他列数据的问题

看起来你需要的是每个CODE只保留一条记录,同时关联该CODE对应的某一行数据(从你的示例来看,是日期最新的那条;如果日期相同则取第一条出现的)。DISTINCT在这里没法满足需求,因为它要求整行所有列的组合都唯一,而你要的是仅CODE列唯一,同时匹配其他列的对应数据。

通用解决方案:使用窗口函数

现在大部分主流数据库(MySQL 8.0+、SQL Server、PostgreSQL等)都支持窗口函数,这是处理这类分组取唯一记录场景最灵活的方式。

假设你的表名为materials,可以用ROW_NUMBER()窗口函数来实现:

WITH ranked_data AS (
    SELECT 
        CODE,
        Material,
        Price,
        Date,
        -- 按CODE分组,每组内按日期倒序、Material升序排序,生成排名
        ROW_NUMBER() OVER (
            PARTITION BY CODE 
            ORDER BY STR_TO_DATE(Date, '%d/%m/%Y') DESC, Material ASC
        ) AS rn
    FROM materials
)
-- 取每个分组里排名第一的记录
SELECT CODE, Material, Price, Date
FROM ranked_data
WHERE rn = 1;

代码解释

  • PARTITION BY CODE:将数据按CODE分成独立的组,每个CODE单独处理
  • ORDER BY STR_TO_DATE(Date, '%d/%m/%Y') DESC:把字符串格式的日期转换为日期类型,按降序排序,确保最新的日期排在每组的最前面
  • Material ASC:如果同一CODE下有多个记录日期相同,按Material名称升序取第一条(你可以根据需求换成其他排序规则,比如Price或者表的主键)
  • rn = 1:筛选出每个分组里排名第一的记录,也就是我们需要的唯一CODE对应的那条数据

适配不同数据库的日期转换

如果你的数据库不是MySQL,需要调整日期转换函数:

  • SQL Server:用CONVERT(DATE, Date, 103)替代STR_TO_DATE(Date, '%d/%m/%Y')
  • PostgreSQL:用TO_DATE(Date, 'DD/MM/YYYY')替代STR_TO_DATE(Date, '%d/%m/%Y')

不支持CTE的数据库写法

如果你的数据库版本较低,不支持公共表表达式(CTE),可以用子查询实现同样的逻辑:

SELECT CODE, Material, Price, Date
FROM (
    SELECT 
        CODE,
        Material,
        Price,
        Date,
        ROW_NUMBER() OVER (
            PARTITION BY CODE 
            ORDER BY STR_TO_DATE(Date, '%d/%m/%Y') DESC, Material ASC
        ) AS rn
    FROM materials
) AS sub_query
WHERE rn = 1;

验证结果

执行上述代码后,输出会和你预期的完全一致:

CODE Material Price Date
111 XYT 1 1/1/2019
444 XYT 4546 28/4/2019
676 TYT 563 28/9/2019

内容的提问来源于stack exchange,提问作者bHaRaTh N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:11:11