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

SQL Server:不丢失行且无需XML PATH/STRING_AGG的GROUP BY替代方案

按Name分组生成Group标识(无需XML PATH/STRING_AGG)

当然有啦!你要的是给每个不同的Name分配唯一的组编号,同时保留原表所有字段对吧?完全不用XML PATH或者STRING_AGG这类字符串拼接方法,用窗口函数就能轻松搞定。

原始表

IdNameDate
1Apple2018/20/04
2Apple2018/20/03
3Orange2018/20/01
4Apple2018/20/02
5Orange2018/20/03

期望结果

IdNameDateGroup
1Apple2018/20/041
2Apple2018/20/031
3Orange2018/20/012
4Apple2018/20/021
5Orange2018/20/032

解决方案:使用DENSE_RANK()窗口函数

这里核心用DENSE_RANK()函数,它可以根据Name的唯一值生成连续的组编号,完全不涉及字符串拼接操作。

对应的SQL代码如下:

SELECT 
    Id,
    Name,
    Date,
    DENSE_RANK() OVER (ORDER BY Name) AS [Group]
FROM 
    你的表名;

补充说明

  • 默认情况下,DENSE_RANK()会按照Name的字母排序分配组号(比如Apple在前是1,Orange在后是2),和你示例结果一致。
  • 如果希望组号按Name首次出现的顺序分配(而不是字母顺序),可以结合嵌套窗口函数来实现:
SELECT 
    Id,
    Name,
    Date,
    DENSE_RANK() OVER (ORDER BY FirstOccurId) AS [Group]
FROM (
    SELECT 
        *,
        MIN(Id) OVER (PARTITION BY Name) AS FirstOccurId
    FROM 你的表名
) t;

这样组号会严格按照每个Name第一次出现的先后顺序来生成,更贴合业务场景的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:19:10