Существует ли функция tSQL, которая создает счетчик после каждого изменения, например, Value2, упорядоченного по Value1 - PullRequest
0 голосов
/ 23 сентября 2019

Мне нужно разработать сценарий SQL, который создает счетчик после каждого изменения значения таблицы, упорядоченного по другому столбцу.

См. Пример: столбец «ExpectedCalculatedValue» должен быть рассчитан tsQL, если это возможно

Я уже опробовал такие функции, как 'Rank' или 'Dense_Rank', но не смог решить проблему.

DECLARE @testTab as TABLE (ID int, [From] datetime, Until datetime, TestID int, 
ExpectedCalculatedValue int)

--TEST DATA
INSERT INTO @testTab VALUES (100, '2019-4-11 11:00', '2019-4-11 11:01', 0, 1)
INSERT INTO @testTab VALUES (100, '2019-4-11 11:01', '2019-4-11 11:11', 200, 2)
INSERT INTO @testTab VALUES (100, '2019-4-11 11:11', '2019-4-11 11:15', 200, 2)
INSERT INTO @testTab VALUES (100, '2019-4-11 11:15', '2019-4-11 11:22', 100, 3)
INSERT INTO @testTab VALUES (100, '2019-4-11 11:22', '2019-4-11 11:45', 200, 4)

select * 
from @testTab a
order by a.[From]


Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

выберите , сумму (случай, когда base.pVal = base.TestID, затем 0 или 1 конец) более (порядок по базе. [От]) в качестве [Counter] из (выберите aa. , lag (aa.TestID, 1, null) over (упорядочить по aa. [From]) как [pVal] из @testTab aa) base

0 голосов
/ 23 сентября 2019

У вас есть точная копия временных столбцов в ваших данных.Это действительно отбрасывает вещи.Итак, первое, что нужно сделать, это ввести уникальный номер.В этом случае он использует row_number():

select a.*,
       sum(case when prev_testid = testid then 0 else 1 end) over (partition by id order by [from], seqnum) as calculated_valued
from (select a.*,
             lag(testid) over (partition by id order by [from], seqnum) as prev_testid
      from (select a.*, row_number() over (partition by id order by [from], [until], testid) as seqnum
            from @testTab a
           ) a
     ) a
order by a.[From];

Однако я бы рекомендовал включить в таблицу столбец identity и использовать его, как в this db <> fiddle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...