Redshift получить строки с самым высоким приоритетом и отметкой времени - PullRequest
1 голос
/ 15 февраля 2020

У меня есть таблица красного смещения с записями следующим образом:


+====+======+=========+============+
| Id | Book | Action  | Timestamp  |
+====+======+=========+============+
| 1  | ABC  | ADDED   | 1111111111 |
+----+------+---------+------------+
| 1  | ABC  | REMOVED | 2222222222 |
+----+------+---------+------------+
| 1  | ABC  | CHECKED | 3333333333 |
+----+------+---------+------------+
| 2  | XYZ  | ADDED   | 4444444444 |
+----+------+---------+------------+
| 2  | XYZ  | CHECKED | 5555555555 |
+----+------+---------+------------+
| 5  | DEF  | CHECKED | 6666666666 |
+----+------+---------+------------+
| 5  | DEF  | CHECKED | 7777777777 |
+====+======+=========+============+

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

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


+====+======+=========+============+
| Id | Book | Action  | Timestamp  |
+====+======+=========+============+
| 1  | ABC  | REMOVED | 2222222222 |
+----+------+---------+------------+
| 2  | XYZ  | ADDED   | 4444444444 |
+----+------+---------+------------+
| 5  | DEF  | CHECKED | 7777777777 |
+====+======+=========+============+

1 Ответ

0 голосов
/ 15 февраля 2020

Простой метод использует row_number():

select t.*
from (select t.*,
             row_number() over (partition by id
                                order by (case action when 'Checked' then 1 else 2 end) desc,
                                         timestamp desc
                               ) as seqnum
      from t
     ) t
where seqnum = 1;
...