SQL技术求助:查询两列组合唯一值对应的全表列数据
解决SQL查询中获取两列组合唯一行的问题
没问题,我来帮你搞定这个SQL查询的问题!你需要从information表中获取ctc_card_no和tarehe这两列组合值唯一的所有行的完整数据,下面给你几种实用的解决方案,你可以根据自己使用的数据库类型选择:
方法一:窗口函数ROW_NUMBER()(兼容大多数数据库)
这是最通用的方案,适合MySQL 8+、SQL Server、PostgreSQL、Oracle等主流数据库。通过给每个ctc_card_no+tarehe的组合分组编号,然后只保留每组的第一行:
SELECT * FROM ( SELECT *, -- 按两列组合分组,给每组的行编号 ROW_NUMBER() OVER (PARTITION BY ctc_card_no, tarehe ORDER BY (SELECT NULL)) AS row_num FROM information ) AS temp_table WHERE row_num = 1;
小提示:如果你希望每组固定返回某一行(比如最新的记录),可以把ORDER BY (SELECT NULL)换成具体的排序列,比如主键列或者时间列,例如ORDER BY id DESC(假设id是主键),这样就能取到每组中ID最大的那一行。
方法二:DISTINCT ON(仅适用于PostgreSQL)
如果你用的是PostgreSQL,这个方法会更简洁:
SELECT DISTINCT ON (ctc_card_no, tarehe) * FROM information ORDER BY ctc_card_no, tarehe; -- 这里的ORDER BY必须包含DISTINCT ON指定的列,也可以追加其他排序条件
它会直接返回每个ctc_card_no+tarehe组合的第一行数据,排序规则由后面的ORDER BY决定。
方法三:GROUP BY + 聚合函数(仅适用于其他列值唯一的场景)
如果在同一个ctc_card_no+tarehe组合下,其他列的值都是相同的,你可以用GROUP BY结合聚合函数来实现:
SELECT ctc_card_no, tarehe, MAX(column_name1) AS column_name1, MIN(column_name2) AS column_name2 -- 把表中其他列都用聚合函数包裹 FROM information GROUP BY ctc_card_no, tarehe;
注意:如果同一组合下其他列存在不同值,这个方法会返回聚合后的结果(比如最大值、最小值),可能不符合你“获取全列数据”的需求,所以谨慎使用。
内容的提问来源于stack exchange,提问作者Nyerere
相关产品推荐
相关产品推荐

