#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
.