J'ai une table en redshift avec les enregistrements comme suit


+====+======+=========+============+
| 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 |
+====+======+=========+============+

Ce que je veux, c'est obtenir un seul enregistrement pour chaque livre. En cas de doublons, hiérarchisez par Action avec CHECKED ayant le rang le plus bas, restez toutes les actions auront la même priorité, puis choisissez l'enregistrement le plus récent.

Sortie attendue


+====+======+=========+============+
| Id | Book | Action  | Timestamp  |
+====+======+=========+============+
| 1  | ABC  | REMOVED | 2222222222 |
+----+------+---------+------------+
| 2  | XYZ  | ADDED   | 4444444444 |
+----+------+---------+------------+
| 5  | DEF  | CHECKED | 7777777777 |
+====+======+=========+============+
1
rjain 15 févr. 2020 à 20:30

1 réponse

Meilleure réponse

Une méthode simple utilise 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;
0
Gordon Linoff 15 févr. 2020 à 17:33