如何在SELECT多列时指定单列应用DISTINCT?附实操示例
解决方法:查询全列并对指定列应用去重/筛选逻辑
看起来你需要查询所有6列数据,同时对指定列(结合你的期望输出,应该是Column4)做特殊处理,还要格式化Column2和Column3的数值格式。下面分两种常见场景给出解决方案:
场景1:保留指定列某一唯一值的所有行(匹配你的期望输出)
从你的期望结果来看,你想要保留Column4值为001的所有行,同时把Column2和Column3转为6位小数格式。这种情况用WHERE筛选+数值格式化就能实现,不同数据库的语法略有差异:
MySQL 版本
SELECT Column1, ROUND(Column2, 6) AS Column2, ROUND(Column3, 6) AS Column3, Column4, Column5, Column6 FROM your_table WHERE Column4 = '001';
PostgreSQL 版本
SELECT Column1, TO_CHAR(Column2::numeric, 'FM999999.000000') AS Column2, TO_CHAR(Column3::numeric, 'FM999999.000000') AS Column3, Column4, Column5, Column6 FROM your_table WHERE Column4 = '001';
SQL Server 版本
SELECT Column1, FORMAT(Column2, 'N6') AS Column2, FORMAT(Column3, 'N6') AS Column3, Column4, Column5, Column6 FROM your_table WHERE Column4 = '001';
执行后就能得到你想要的结果:仅包含Column4为001的行,且Column2、Column3显示为6位小数格式。
场景2:对指定列全局去重(每个唯一值仅返回一行)
如果你的真实需求是对指定列(比如Column4)去重,即结果中该列每个值只出现一次,同时返回对应其他列的数据,可以用窗口函数或者数据库特定语法:
PostgreSQL 专属语法(简洁高效)
SELECT DISTINCT ON (Column4) Column1, TO_CHAR(Column2::numeric, 'FM999999.000000') AS Column2, TO_CHAR(Column3::numeric, 'FM999999.000000') AS Column3, Column4, Column5, Column6 FROM your_table ORDER BY Column4;
通用SQL(所有数据库支持)
用窗口函数ROW_NUMBER()实现,能自定义取每个分组的哪一行:
SELECT Column1, FORMAT(Column2, 6) AS Column2, FORMAT(Column3, 6) AS Column3, Column4, Column5, Column6 FROM ( SELECT *, -- 按Column4分组,每组按Column1排序取第一行 ROW_NUMBER() OVER (PARTITION BY Column4 ORDER BY Column1) AS row_num FROM your_table ) t WHERE row_num = 1;
内容的提问来源于stack exchange,提问作者Houssem Timoumi
相关产品推荐
相关产品推荐

