PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Suppression des événements qui se chevauchent partiellement/entièrement avec des horodatages de début et de fin sur plusieurs valeurs

La condition de jointure :

  • Essayez de trouver un autre événement avec la même salle
  • Mais besoin d'avoir un identifiant différent du vôtre
  • Les dates doivent se chevaucher Déterminer si deux plages de dates se chevauchent
  • Doit enfin avoir une date de création ultérieure.

Si vous ne trouvez aucune autre ligne, cela signifie que vous êtes seul, soit parce qu'il n'y a pas de chevauchement, soit parce que vous êtes le dernier rendez-vous.

DÉMO SQL

SELECT a.*
FROM "events" a
LEFT JOIN "events" b
  ON a.room = b.room 
 AND a.id <> b.id
 AND a."start" <= b."end"
 AND a."end"   >= b."start"
 AND a.created_at < b.created_at
WHERE b.id IS NULL;

SORTIE

| id |                start |                  end |                  created_at |  room |
|----|----------------------|----------------------|-----------------------------|-------|
|  2 | 2019-01-23T18:30:00Z | 2019-01-23T19:00:00Z | 2019-01-23T01:04:05.861876Z | Room1 |
|  7 | 2019-01-23T20:15:00Z | 2019-01-23T20:45:00Z |  2019-01-20T20:20:20.20202Z | Room1 |
|  9 | 2019-01-23T18:30:00Z | 2019-01-23T19:00:00Z | 2019-01-23T01:04:05.861877Z | Room2 |
| 14 | 2019-01-23T20:15:00Z | 2019-01-23T20:45:00Z |  2019-01-20T20:20:20.20202Z | Room2 |
| 16 | 2019-01-23T20:15:00Z | 2019-01-23T20:45:00Z | 2019-01-20T20:20:20.202021Z | Room3 |