Мне нужен тип сортировки по группам, который я не смог понять с помощью ROW_NUMBER в T-SQL - PullRequest
3 голосов
/ 08 ноября 2019

У меня есть таблица со строкой 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" в порядке. кроме этого;
  • есть две последовательности а, и они будут учитываться отдельно
  • (не 1,2,1,1,3,3,3). и сортировка должна быть по id, а не по col2 (поэтому order by col2 НЕ в порядке).

Я хочу, чтобы это число увеличивалось на единицу в любое время при изменении col2 по сравнению с предыдущей строкой.

row_number () over (partition by col1 order by col2) НЕ РАБОТАЕТ. потому что я хочу, чтобы это было заказано по id.

1 Ответ

2 голосов
/ 08 ноября 2019

Используя 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

...