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

如何在SQL Server中按插入顺序对指定列去重?

解决按插入顺序去重并排序的SQL问题

我来帮你搞定这个问题~你的需求是针对parent_id=1的数据,按插入顺序(也就是表中id递增的顺序)对element去重,但之前用NEWID()会生成随机排序,完全不符合预期,而且DISTINCT本身并不会保留原始插入顺序,必须配合明确的排序规则才行。

正确的解决方案

这里有两种实用的方法可以实现你的需求:

方法1:使用窗口函数ROW_NUMBER()

这个方法能精准定位每个element第一次出现的记录,再按插入顺序排序:

SELECT element
FROM (
    SELECT 
        element,
        -- 按element分组,每组内按id从小到大排序,标记行号
        ROW_NUMBER() OVER (PARTITION BY element ORDER BY id ASC) AS rn
    FROM mytable
    WHERE parent_id = 1
) AS sub_query
-- 只保留每组的第一条记录(即该element最早插入的那条)
WHERE rn = 1
-- 按最早插入的id排序,确保是插入顺序
ORDER BY id ASC;

方法2:使用GROUP BY配合MIN(id)

这个方法更简洁,通过分组取每个element的最小id(也就是第一次插入的id),再按这个id排序:

SELECT element
FROM mytable
WHERE parent_id = 1
GROUP BY element
-- 按每个element第一次出现的id排序
ORDER BY MIN(id) ASC;

为什么你的原代码不符合预期?

你之前用ORDER BY NEWID()是生成随机GUID,结果自然是随机打乱的,完全不符合“按插入顺序”的要求;另外DISTINCT只是负责去重,SQL标准里并没有规定DISTINCT后的结果会保留原始顺序,必须通过ORDER BY指定基于插入顺序的字段(比如自增的id)才能保证顺序正确。

内容的提问来源于stack exchange,提问作者shafi7468

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:36:24