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

SQL(SMSS)中基于多列生成自定义ID的技术求助

基于多列组合生成连续ID的解决方案(SQL Server/SSMS)

嘿,我来帮你搞定这个ID生成的问题!从你的示例数据能看出来,这个ID是根据column1、column2、column3的唯一组合来分配连续编号的——相同的三列值对应同一个ID,不同组合的ID依次递增,对吧?

一、查询时动态生成ID(临时场景)

如果只是需要在查询结果里临时显示这个ID,不用修改原表,直接用DENSE_RANK()窗口函数就能完美实现需求:

SELECT 
    DENSE_RANK() OVER (ORDER BY column1, column2, column3) AS ID,
    column1,
    column2,
    column3
FROM YourTableName;

为什么选DENSE_RANK()?

它会按照你指定的三列排序,给每一组完全相同的列组合分配连续的唯一编号,不会像RANK()那样出现排名空缺,正好匹配你示例里的规则——比如两个2017 | 101 | 1都会得到ID 2,下一个不同组合直接跳到3。

二、永久给表添加ID列

如果要把这个ID列永久加到表中,可以分两步操作:

  1. 先给表新增一个ID列:
ALTER TABLE YourTableName ADD ID INT;
  1. 用CTE(公用表表达式)给新增的ID列批量赋值:
WITH RankedData AS (
    SELECT 
        ID,
        DENSE_RANK() OVER (ORDER BY column1, column2, column3) AS NewID
    FROM YourTableName
)
UPDATE RankedData
SET ID = NewID;

后续维护提示

如果之后有新数据插入,想要保持这个ID规则的话,你可以:

  • 在插入时提前计算对应的DENSE_RANK()值再插入
  • 或者创建一个触发器,在插入/更新操作时自动维护ID列的值

验证示例数据

把你的示例数据代入第一个查询,会得到和你给出的完全一致的结果:

ID | column1 | column2 | column3
1 | 2016 | 101 | 1
2 | 2017 | 101 | 1
2 | 2017 | 101 | 1
3 | 2017 | 303 | 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:49:27