如何从数据库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
相关产品推荐
相关产品推荐

