如何在SQL Server中为分组扩展row_number功能?
更简洁高效的实现方案
嘿,你的需求是给每个唯一的VAL1分配连续递增的序号,然后输出对应的所有行对吧?你的当前实现是可行的,但确实有更简洁、性能更优的方式——直接用DENSE_RANK()窗口函数就能一步到位,不需要额外的CTE和表关联操作!
优化后的代码
DECLARE @TABLE1 TABLE ( VAL1 VARCHAR(2), VAL2 VARCHAR(2) ) INSERT INTO @TABLE1 VALUES ('A', 'X'), ('A', 'Y'), ('A', 'Z'), ('B', 'X'), ('B', 'Y'), ('C', 'X'), ('D', 'X') SELECT DENSE_RANK() OVER(ORDER BY VAL1) AS RW, VAL1, VAL2 FROM @TABLE1 ORDER BY RW, VAL2 -- 确保输出顺序和你预期的一致
为什么这个方法更好?
- 代码更简洁:省去了创建CTE分组、再关联原表的步骤,逻辑一目了然,维护起来更方便
- 性能更优:避免了表关联操作,减少了查询的执行开销,尤其是在数据量较大时,这个优势会更明显
- 结果完全符合预期:
DENSE_RANK()会按照VAL1的排序,给每个唯一的VAL1分配连续的序号,不会出现间隔,和你想要的输出完全匹配
对比你的原方法,本质上都是给每个VAL1分配序号,但DENSE_RANK()直接在原表上计算窗口函数,省去了中间的分组和关联步骤,是更直接高效的实现方式。
内容的提问来源于stack exchange,提问作者razielx4crazy
相关产品推荐
相关产品推荐

