Maison >base de données >tutoriel mysql >Comment répliquer les fonctionnalités LEAD et LAG dans SQL Server 2008 ?

Comment répliquer les fonctionnalités LEAD et LAG dans SQL Server 2008 ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-28 21:23:11972parcourir

How to Replicate LEAD and LAG Functionalities in SQL Server 2008?

Alternative à la fonction LEAD LAG dans SQL Server 2008

Dans SQL Server 2008, l'incapacité d'utiliser les fonctions LEAD et LAG pose des problèmes lors de la comparaison lignes actuelles avec les valeurs des lignes suivantes. Cet article explore une méthode alternative pour les utilisateurs de SQL Server 2008 qui ont besoin de cette fonctionnalité.

Interrogation des lignes suivantes et précédentes

L'objectif est d'isoler les lignes où se trouve la ligne actuelle. StatusId est 1 et le StatusId de la ligne suivante est 6, les deux lignes ayant le même horodatage des minutes. Puisque les fonctions LEAD et LAG ne sont pas disponibles, nous pouvons utiliser une auto-jointure.

Approche d'auto-jointure

La requête suivante établit une jointure entre la table (appelée comme t) et un tableau « ligne suivante » (appelé tnext). Les conditions de jointure incluent :

  • Valeurs d'identifiant correspondant, indiquant les lignes adjacentes
  • StatusId pour t étant 1, signifiant la ligne actuelle avec le statut souhaité
  • StatusId pour tnext étant 6, indiquant la ligne suivante avec le statut cible
  • Un décalage horaire inférieur à 60 secondes entre les champs MinStartTime, garantissant une proximité temporelle

Requête pour une correspondance précise des minutes

Si une correspondance précise des minutes est requise au lieu d'une simple proximité dans la minute, la requête peut être modifiée pour inclure la condition datepart(minute, t.MinStartTime) = datepart(minute, tnext.MinStartTime).

Exemple de requête

En utilisant la table fournie comme exemple, voici les deux versions de la requête :

Version 1 (en une minute proximité):

select t.*
from table t join
     table tnext
     on t.id = tnext.id - 1 and
        t.StatusId = 1 and
        tnext.StatusId = 6 and
        datediff(second, t.MinStartTime, tnext.MinStartTime) < 60;

Version 2 (correspondance précise des minutes):

select t.*
from table t join
     table tnext
     on t.id = tnext.id - 1 and
        t.StatusId = 1 and
        tnext.StatusId = 6 and
        datediff(second, t.MinStartTime, tnext.MinStartTime) < 60 and
        datepart(minute, t.MinStartTime) = datepart(minute, tnext.MinStartTime);

Sortie

La sortie de ces requêtes récupérera les lignes souhaitées qui satisfont aux critères spécifiés : Id 6, où StatusId vaut 1 et est suivi de un identifiant avec StatusId 6 avec le même horodatage minute (pour la version 2).

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!

Déclaration:
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