Source : https://bertwagner.com/posts/gaps-and-islands/

Alors voici le problème : Vous voulez faire un calendrier sur votre site WEB, avec des événements qui peuvent se recouper.

Créons une table de test :

DROP TABLE IF EXISTS OverlappingDateRanges;
CREATE TABLE OverlappingDateRanges (StartDate date, EndDate date); 

Insérons quelques données

INSERT INTO OverlappingDateRanges VALUES
('2017-08-24', '2017-09-23'),
('2017-08-24', '2017-09-20'),
('2017-09-23', '2017-09-27'),
('2017-09-25', '2017-10-10'),
('2017-10-17', '2017-10-18'),
('2017-10-25', '2017-11-03'),
('2017-11-03', '2017-11-15')

Vérification du contenu :

SELECT * FROM mes_evenements
StartDateEndDate
2017-08-242017-09-23
2017-08-242017-09-20
2017-09-232017-09-27
2017-09-252017-10-10
2017-10-172017-10-18
2017-10-252017-11-03
2017-11-032017-11-15

Voici la requête qui va constituer des groupes avec les plages de date qui se recoupent :

SELECT
MIN(StartDate) AS IslandStartDate,
MAX(EndDate) AS IslandEndDate
FROM
(
SELECT
*,
CASE WHEN Groups.PreviousEndDate >= StartDate THEN 0 ELSE 1 END AS IslandStartInd,
SUM(CASE WHEN Groups.PreviousEndDate >= StartDate THEN 0 ELSE 1 END) OVER (ORDER BY Groups.RN) AS IslandId
FROM
(
SELECT
ROW_NUMBER() OVER(ORDER BY StartDate,EndDate) AS RN,
StartDate,
EndDate,
LAG(EndDate,1) OVER (ORDER BY StartDate, EndDate) AS PreviousEndDate
FROM
OverlappingDateRanges
) Groups
) Islands
GROUP BY
IslandId
ORDER BY
IslandStartDate

Résultat :

IslandStartDateIslandEndDate
2017-08-242017-10-10
2017-10-172017-10-18
2017-10-252017-11-15

Print Friendly, PDF & Email

Leave a Reply

You have to agree to the comment policy.

Blue Captcha Image
Refresh

*

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.