如何在SQL中删除列重复行?DISTINCT失效问题求助
解决SQL中DISTINCT去重无效的问题
DISTINCT是对整行数据去重,只要SELECT语句里的任意一列值不同,整行就会被视为不同条目。你看到的重复歌曲标题,大概率是同一首歌(相同Track)对应了不同的Artist、Valence或Stream值,所以DISTINCT无法过滤掉这些行。以下是具体解决方法:
按歌曲标题分组,保留指定维度的目标值
如果你想每个歌曲只保留播放量最高的记录,可以用GROUP BY结合聚合函数实现:SELECT Track, MAX(Artist) AS Artist, -- 也可用MIN,根据需求选择 MAX(Valence) AS Valence, MAX(Stream) AS Stream FROM dbo.[spotify _db] GROUP BY Track ORDER BY Stream DESC, Valence DESC若同一歌曲对应多个艺术家,可使用STRING_AGG合并(SQL Server 2017及以上版本支持):
SELECT Track, STRING_AGG(Artist, ', ') AS Artists, MAX(Valence) AS Valence, MAX(Stream) AS Stream FROM dbo.[spotify _db] GROUP BY Track ORDER BY Stream DESC, Valence DESC用窗口函数筛选每个歌曲的最优记录
如果需要保留原表中对应最高播放量的完整行数据(不想通过聚合函数修改字段值),可以用窗口函数排名筛选:WITH RankedTracks AS ( SELECT Track, Artist, Valence, Stream, ROW_NUMBER() OVER (PARTITION BY Track ORDER BY Stream DESC, Valence DESC) AS rn FROM dbo.[spotify _db] ) SELECT Track, Artist, Valence, Stream FROM RankedTracks WHERE rn = 1 ORDER BY Stream DESC, Valence DESC这个方法会给每个歌曲的记录按播放量、Valence降序排名,仅保留排名第一的行,确保每个歌曲只有一条记录。
检查并清洗脏数据
有时候看似相同的歌曲标题,可能存在大小写差异(如"Sunflower"和"sunflower")、首尾空格或特殊字符(如"Closer "和"Closer"),这种情况DISTINCT会判定为不同值。可以先清洗数据:SELECT DISTINCT LTRIM(RTRIM(LOWER(Track))) AS CleanedTrack, Artist, Valence, Stream FROM dbo.[spotify _db]
内容的提问来源于stack exchange,提问作者alentot1222
相关产品推荐
相关产品推荐

