Рассчитать "положение в бегах" в SQL - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть таблица последовательных идентификаторов (целые числа, 1 ... n) и значений (целых чисел), например:

Таблица ввода:

id value
-- -----
 1   1
 2   1
 3   2
 4   3
 5   1
 6   1
 7   1 

Спуск пото есть в порядке увеличения идентификатора, я хочу подсчитать, сколько раз подряд одно и то же значение было видно последовательно, то есть позиция в серии:

Таблица вывода:

id value position in run  
-- ----- ---------------  
 1   1          1
 2   1          2
 3   2          1
 4   3          1
 5   1          1
 6   1          2
 7   1          3

Есть идеи?Я искал комбинацию оконных функций, включая опережение и отставание, но не могу придумать это.Обратите внимание, что одно и то же значение может отображаться в столбце значений как часть разных прогонов, поэтому разделение по значению может не помочь решить эту проблему.Я на Улей 1.2.

1 Ответ

0 голосов
/ 16 ноября 2018

Одним из способов является использование подхода с разностью номеров строк для классификации последовательных одинаковых значений в одну группу. Затем функция номера строки, чтобы получить желаемые позиции в каждой группе.

Запрос на назначение групп (Выполнение этого поможет вам понять, как назначаются группы.)

select t.*
,row_number() over(order by id) - row_number() over(partition by value order by id) as rnum_diff
from tbl t

Окончательный запрос с использованием row_number для получения позиций в каждой группе, назначенной с помощью вышеуказанного запроса.

select id,value,row_number() over(partition by value,rnum_diff order by id) as pos_in_grp
from (select t.*
      ,row_number() over(order by id) - row_number() over(partition by value order by id) as rnum_diff
      from tbl t
     ) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...