首页 > 解决方案 > 我需要一种在 T-SQL 上使用 ROW_NUMBER 无法计算的组排序

问题描述

我有一个 table_id 行和其他 2 行的表。我想要带有 row_number 函数的编号类型,我希望结果看起来像这样:

id   |col1 |col2  |what I want  
------------------------------
1    |x    |a     |1  
2    |x    |b     |2  
3    |x    |a     |3  
4    |x    |a     |3  
5    |x    |c     |4  
6    |x    |c     |4  
7    |x    |c     |4

请考虑一下;

我希望这个数字在 col2 与上一行相比发生变化时增加一。

row_number () over (partition by col1 order by col2)不工作。因为我希望它按 id 排序。

标签: tsqlrow-number

解决方案


使用LAG和窗口COUNT出现可以让你得到你所追求的:

WITH Previous AS(
    SELECT V.id,
           V.col1,
           V.col2,
           V.[What I want],
           LAG(V.Col2,1,V.Col2) OVER (ORDER BY ID ASC) AS PrevCol2
    FROM (VALUES(1,'x','a',1),  
                (2,'x','b',2),  
                (3,'x','a',3),  
                (4,'x','a',3),  
                (5,'x','c',4),  
                (6,'x','c',4),  
                (7,'x','c',4))V(id, col1, col2, [What I want]))
SELECT P.id,
       P.col1,
       P.col2,
       P.[What I want],
       COUNT(CASE P.Col2 WHEN P.PrevCol2 THEN NULL ELSE 1 END) OVER (ORDER BY P.ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) +1 AS [What you get]
FROM Previous P;

DB<>小提琴


推荐阅读