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

SQL Server中为每个唯一Amount值分配连续序号的实现方案

给SQL Server中Amount的唯一值分配连续序号的解决方案

嘿,作为SQL Server新手,这个需求其实很好解决!咱们可以借助CTE(公共表表达式)和窗口函数的组合来实现,完全匹配你想要的输出效果。

解决方案代码

-- 先定义CTE来获取每个Amount首次出现的位置
WITH RankedAmounts AS (
    SELECT 
        Amount,
        BillID,
        -- 获取每个Amount第一次出现时的行号(如果有固定排序字段,比如创建时间,建议替换(SELECT NULL)为该字段)
        MIN(ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) OVER (PARTITION BY Amount) AS FirstOccurrence
    FROM 
        YourTableName -- 替换成你实际的表名
)
-- 基于首次出现位置分配连续序号
SELECT 
    Amount,
    BillID,
    DENSE_RANK() OVER (ORDER BY FirstOccurrence) AS unique
FROM 
    RankedAmounts
ORDER BY 
    FirstOccurrence, BillID; -- 保持和示例一致的输出顺序

代码解释

  • ROW_NUMBER() OVER (ORDER BY (SELECT NULL)):给每一行分配一个唯一行号,用来标记数据的原始顺序。如果你的表有明确的排序字段(比如创建时间、自增ID),建议把(SELECT NULL)换成那个字段,这样顺序会更稳定。
  • MIN(...) OVER (PARTITION BY Amount):按Amount分组,取出每个组里最小的行号,也就是该Amount第一次出现的位置。
  • DENSE_RANK() OVER (ORDER BY FirstOccurrence):根据Amount首次出现的顺序分配连续序号,相同的Amount会得到同一个序号,而且序号不会跳号(这正是DENSE_RANK和RANK的核心区别)。

效果验证

执行这段代码后,你会得到和示例完全一致的结果:

Amount | BillID | unique
-------+--------+-------
500 | 10009 | 1
500 | 1492 | 1
350 | 15892 | 2
222 | 15596 | 3
899 | 20566 | 4
350 | 9566 | 2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:12:59