能否将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
相关产品推荐
相关产品推荐

