Как добавить дополнительные правила по сравнению с предыдущей строкой при ранжировании SQL?

#sql #snowflake-cloud-data-platform

Вопрос:

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

отметка времени Дата Статус ранг dense_rank номер строки
2021-03-22 05:03:22 2021-03-22 Открыть 1 1 1
2021-03-24 07:10:05 2021-03-24 отклоненный 2 2 2
2021-04-04 09:01:10 2021-04-24 отклоненный 3 3 3 (наугад)
2021-04-04 09:01:10 2021-04-24 Открыть 3 3 4 (наугад)

Если мы взглянем на 3-ю и 4-ю записи, то увидим, что они имеют одинаковую точную метку времени.

И я хочу последовательно сортировать это по возрастанию временной метки (не по номеру строки, потому что он случайный, не по рангу и плотному рангу, потому что он не будет возрастать).

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

открыто (2021-03-22) — отклонено (2021-03-24) — открыто (2021-04-24) — отклонено (2021-04-24)

Существуют ли какие-либо способы включить это дополнительное правило в rank() over (partition by ... order by ...) ?

Ответ №1:

Предполагая, что вам нужна эта последовательность по всей таблице, мы можем попробовать:

 SELECT *, ROW_NUMBER() OVER (ORDER BY timestamp,  CASE status WHEN 'OPEN' THEN 1 ELSE 2 END) AS rn FROM yourTable ORDER BY timestamp, CASE status WHEN 'OPEN' THEN 1 ELSE 2 END;  

Второй уровень ORDER BY предложения сортирует открытые записи перед записями любого другого статуса. Если бы вы хотели, чтобы эта последовательность повторялась для заданного набора записей в таблице, вам нужно было бы добавить PARTITION BY предложение к вызову ROW_NUMBER .