Создать счетчик с условием выполнено - PullRequest
0 голосов
/ 04 сентября 2018

Я хочу создать счетчик с условием. С помощью id я хочу создать счетчик, который начинается с 1, и всякий раз, когда столбец changer изменяется с x на y или y на x, добавляют 1 к созданному счетчику.

 id  changer
  1       x
  1       x
  1       y
  1       x
  1       y
  2       y
  2       x
  2       y
  3       x
  3       y
  3       x
  3       y
  3       y

Ожидаемый результат:

 id  changer  counter
  1       x        1
  1       x        1
  1       y        2
  1       x        3
  1       y        4
  2       y        1
  2       x        2
  2       y        3
  3       x        1
  3       y        2
  3       x        3
  3       y        4
  3       y        4

1 Ответ

0 голосов
/ 04 сентября 2018

Интересно, что если вам нужно только максимальное значение, это значительно упрощает задачу, поскольку вам нужно только создать счетчик для строк, в которых произошло изменение, а затем получить максимальное значение:

WITH tCountAtChange as 
(SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY date_time) + 1 as aCounter 
FROM
(SELECT UniqueNbr, date_time, id
,CASE WHEN LAG(changer) OVER (PARTITION BY id ORDER BY date_time) <> changer THEN 'YES' ELSE 'NO' END as ChangeFlag
FROM MyTable) a
WHERE ChangeFlag = 'YES')

SELECT MyTable.id, COALESCE(MAX(aCounter), 1) as MaxCounter
FROM MyTable
LEFT JOIN tCountAtChange
ON MyTable.UniqueNbr = tCountAtChange.UniqueNbr
GROUP BY MyTable.id

Результат:

id  MaxCounter
 1           4
 2           3
 3           4

Вам понадобится поле date_time или какое-либо поле сортировки для предложений ORDER BY, а также UniqueNbr (уникальный идентификатор), который вы можете использовать для объединения, или вы всегда можете создать его в другом cte с помощью функции ROW_NUMBER.

...