PostgreSQL中STRING_AGG结果排序不符预期的调整方案咨询
解决方案
你需要对查询语句做两处修改,来匹配期望的结果:
- 给
STRING_AGG添加DISTINCT关键字,确保播放列表名称去重(符合题目要求的“去重”列表); - 调整排序逻辑,将播放列表ID的升序排序改为降序。
修改后的完整查询语句:
SELECT t.composer, STRING_AGG(DISTINCT p.name, ', ' ORDER BY p.playlist_id DESC) AS list_of_playlists FROM playlist_track AS pt JOIN track AS t ON pt.track_id = t.track_id JOIN playlist AS p ON pt.playlist_id = p.playlist_id WHERE p.name LIKE '%Classical%' AND t.composer IS NOT NULL GROUP BY t.composer
说明
- 添加
DISTINCT:避免同一个作曲家因在某个播放列表中有多首歌曲,导致该播放列表名称被重复加入结果列表,严格满足“去重”的要求。 - 改为
ORDER BY p.playlist_id DESC:原查询按播放列表ID从小到大排序,所以ID12的Classical总是排在前面;改为降序后,ID更大的Classical 101系列播放列表(ID13、ID15)会排在Classical(ID12)前面,这正好匹配你期望的Antonio、Astor、Bela的列表顺序。
注:你期望结果中Aaron Copland的列表顺序与修改后结果不一致,可能是笔误——按统一逻辑,Classical 101 - The Basics应该排在Classical前面,这更符合将系列播放列表前置的需求。
内容的提问来源于stack exchange,提问作者Aditya Mishra
相关产品推荐
相关产品推荐

