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

问题描述 投票:1回答:1

我有一个带有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排序。

tsql row-number
1个回答
0
投票

使用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;
© www.soinside.com 2019 - 2024. All rights reserved.