Maison > base de données > tutoriel mysql > Comment fusionner efficacement les intervalles de dates qui se chevauchent dans SQL ?

Comment fusionner efficacement les intervalles de dates qui se chevauchent dans SQL ?

Susan Sarandon
Libérer: 2025-01-04 16:22:41
original
581 Les gens l'ont consulté

How to Efficiently Merge Overlapping Date Intervals in SQL?

Fusionner des intervalles de dates qui se chevauchent

Dans le domaine de l'analyse des données, il est courant de rencontrer des plages de temps ou des intervalles de dates qui se chevauchent. Pour fusionner efficacement ces intervalles qui se chevauchent en enregistrements distincts, une solution robuste et efficace est nécessaire.

Une approche simple pour fusionner des intervalles de dates qui se chevauchent est présentée dans la question donnée, en utilisant une série d'instructions UPDATE dans une boucle. Bien que cette méthode permette d'obtenir le résultat souhaité, elle introduit la question de savoir s'il existe une solution plus élégante ou plus performante.

Une approche alternative

Une approche alternative, mise en œuvre dans la réponse fournie, exploite la puissance des sous-requêtes corrélées et des conditions NON EXISTES. Cette approche implique plusieurs instructions SQL qui fonctionnent conjointement pour identifier et fusionner les intervalles qui se chevauchent :

SELECT 
       s1.StartDate,
       --t1.EndDate 
       MIN(t1.EndDate) AS EndDate
FROM @T s1 
INNER JOIN @T t1 ON s1.StartDate <= t1.EndDate
  AND NOT EXISTS(SELECT * FROM @T t2 
                 WHERE t1.EndDate >= t2.StartDate AND t1.EndDate < t2.EndDate) 
WHERE NOT EXISTS(SELECT * FROM @T s2 
                 WHERE s1.StartDate > s2.StartDate AND s1.StartDate <= s2.EndDate) 
GROUP BY s1.StartDate 
ORDER BY s1.StartDate 
Copier après la connexion

Décomposition des étapes :

  1. Identification des intervalles qui se chevauchent : La requête associe chaque intervalle (s1) à d’autres intervalles (t1) qui le chevauchent. Ceci est réalisé grâce à la condition INNER JOIN s1.StartDate <= t1.EndDate.
  2. Excluding Indirect Overlaps : La sous-requête NOT EXISTS(SELECT * FROM @T t2 WHERE t1.EndDate > ;= t2.StartDate ET t1.EndDate < t2.EndDate) garantit que seuls les chevauchements directs sont pris en compte. Cela empêche la fusion d'intervalles indirectement connectés par une chaîne d'intervalles qui se chevauchent.
  3. Élimination des intervalles en double : La condition externe NOT EXISTS NOT EXISTS(SELECT * FROM @T s2 WHERE s1. Date de début > s2.StartDate ET s1.StartDate <= s2.EndDate) empêche la fusion d'intervalles distincts ayant la même date de début mais une date de fin différente. Cela garantit que seuls les intervalles uniques sont représentés dans le résultat.
  4. Sélection d'intervalles qui ne se chevauchent pas : en corrélant les sous-requêtes et en utilisant les conditions NOT EXISTS, la requête identifie et fusionne efficacement les intervalles qui se chevauchent tout en excluant les doublons. ou des intervalles indirectement connectés.
  5. Cette approche offre des performances et une clarté améliorées par rapport à l'itérative Méthode UPDATE, ce qui en fait une solution privilégiée pour fusionner des intervalles de dates qui se chevauchent dans les environnements SQL.

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal