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

能否将SELECT DISTINCT应用于查询语句中非首位的任意列?

关于SELECT DISTINCT列位置的疑问解答

嘿,我来帮你理清这个问题~首先得纠正一个常见的误解:SELECT DISTINCT并不是只作用于第一个列,它是基于你SELECT后面所有列的整体组合来判断唯一性的,和列的排序完全没有关系。

你的例子可以简化成一次查询

你之前的写法是先通过子查询把song_name放在第一位做去重,再重新调整列顺序,其实完全没必要。直接在一次查询里就能实现你想要的结果:

SELECT DISTINCT year_rank AS rank, group_name, song_name
FROM billboard_top_100_year_end
WHERE year = 2010
ORDER BY rank LIMIT 10;

这个查询里,DISTINCT会基于rank、group_name、song_name三列的组合去重,和你原来的子查询逻辑完全一致,但省去了二次查询的步骤,列的顺序也直接符合你的需求。

如果需要对单一列单独去重

如果你真正的需求是只针对某一列(比如song_name)去重,而不是所有列的组合,那SELECT DISTINCT就不适用了——因为它始终会考虑所有选中列的唯一性。这时候可以用窗口函数来实现,比如ROW_NUMBER():

SELECT song_name, rank, group_name
FROM (
  SELECT 
    song_name, 
    year_rank AS rank, 
    group_name,
    -- 按song_name分组,每组内按rank排序,给每行标序号
    ROW_NUMBER() OVER (PARTITION BY song_name ORDER BY rank) AS rn
  FROM billboard_top_100_year_end
  WHERE year = 2010
) t
-- 只取每个song_name分组里的第一行
WHERE rn = 1
ORDER BY rank LIMIT 10;

这个写法会确保每个song_name只出现一次,同时保留对应排名最高的那条记录。

内容的提问来源于stack exchange,提问作者João Pedro Reis Silva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:04:07