Как получить повторяемый раздел как новый раздел один за другим? - PullRequest
0 голосов
/ 24 марта 2019

«Partition by» в предложении OVER группирует все значения как уникальные, точно так же, как «Distinct» или «Group by» do.

Вот как это работает в моем запросе с row_number ():

    id st t  row_number
    -------------------
    1  1  1  1
    1  1  2  2
    1  1  3  3
    2  1  3  1
    1  2  4  1
    1  1  10 4

Вот что я хочу:

    id st t  uniq_row_number
    ------------------
    1  1  1  1
    1  1  2  2
    1  1  3  3
    2  1  3  1
    1  2  4  1
    1  1  10 1

Независимо от того, была ли новая строка ранее, она читается как новый раздел после каждого изменения раздела. Если раздел повторяется, значит, uniq_row_number получает +1. Если новый раздел приходит с новой строкой: boom, он получает uniq_row_number 1.

Мой SQL-запрос:

    SELECT id, st, t,
    row_number() OVER (PARTITION BY id, st ORDER BY id, st) cat_num,
    min(t) over (PARTITION BY id, st) min_t,
    max(t) over (PARTITION BY id, st) max_t
    FROM tabl ORDER BY t;

Код SQL здесь: http://sqlfiddle.com/#!18/d4290/2

1 Ответ

1 голос
/ 24 марта 2019

Это называется проблемой "пробелов и островов". Вам необходимо определить группу для каждого «острова» схожих значений. Тогда вы можете использовать row_number().

Разница номеров строк - это удобный способ определения островов:

select t.*,
       row_number() over (partition by id, seqnum_t - seqnum_it
                          order by t
                         ) as uniq_row_number
from (select t.*,
             row_number() over (order by t) as seqnum_t,
             row_number() over (partition by id order by t) as seqnum_it,
      from t
     ) t;

Лучший способ понять, как это работает, - посмотреть на результаты подзапроса. Вы должны увидеть, как разница номеров строк определяет группы, которые вас интересуют.

...