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
相关产品推荐
相关产品推荐

