Эффективное приращение ROW_NUMBER, когда столбец соответствует значению - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь найти эффективный способ получить столбец Expected ниже только из Id и State.Я хочу, чтобы число Expected увеличивалось каждый раз, когда State равно 0 (заказано Id).

+----+-------+----------+
| Id | State | Expected |
+----+-------+----------+
|  1 |     0 |        1 |
|  2 |     1 |        1 |
|  3 |     0 |        2 |
|  4 |     1 |        2 |
|  5 |     4 |        2 |
|  6 |     2 |        2 |
|  7 |     3 |        2 |
|  8 |     0 |        3 |
|  9 |     5 |        3 |
| 10 |     3 |        3 |
| 11 |     1 |        3 |
+----+-------+----------+

Мне удалось сделать это с помощью следующего SQL, новремя выполнения очень мало при большом наборе данных:

WITH Groups AS 
(
   SELECT Id, ROW_NUMBER() OVER (ORDER BY Id) AS GroupId FROM tblState WHERE State=0
)
SELECT S.Id, S.[State], S.Expected, G.GroupId FROM tblState S
   OUTER APPLY (SELECT TOP 1 GroupId FROM Groups WHERE Groups.Id <= S.Id ORDER BY Id DESC) G

Существует ли более простой и эффективный способ получения этого результата?(В SQL Server 2012 или более поздней версии)

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

В другом методе используется subquery:

select *,
       (select count(*)
        from table t1
        where t1.id < t.id and state = 0
       ) as expected
from table t;
0 голосов
/ 01 июня 2018

Просто используйте совокупную сумму:

select s.*,
       sum(case when state = 0 then 1 else 0 end) over (order by id) as expected
from tblState s;
...