我需要一种无法在T-SQL上用ROW_NUMBER弄清楚的组排序方式

时间:2019-11-08 11:05:07

标签: tsql 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

请考虑一下;

  • 只有一个x,因此“ partition by col1”是可以的。除此之外;
  • 有两个a序列,它们将分别计数
  • (不是1,2,1,1,3,3,3)。并且排序必须按ID而不是col2进行(因此 order by col2不好)。

每当col2更改时,我希望该数字比上一行增加一个。

row_number () over (partition by col1 order by col2)不起作用。因为我要按ID排序。

1 个答案:

答案 0 :(得分:2)

使用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<>Fiddle