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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 00:47:05