Récupération de lignes avec des valeurs de colonne évolutives
Problème :
Vous êtes chargé d'extraire des lignes d'un tableau basé sur les modifications apportées à une valeur de colonne spécifique. Dans les exemples de données fournis, la colonne « Valeur » subit plusieurs décalages. Votre objectif est d'identifier et de sélectionner uniquement les lignes pour lesquelles cette valeur a changé.
Solution :
Utilisation du partitionnement ROW_NUMBER :
Cette technique utilise la fonction ROW_NUMBER de SQL Server pour attribuer des numéros séquentiels aux lignes au sein de partitions « Valeur » distinctes, triés par ordre « Heure ». La requête suivante applique ce concept :
WITH x AS ( SELECT value, time, rn = ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time) FROM dbo.table ) SELECT * FROM x WHERE rn = 1;
En sélectionnant les lignes avec une valeur "rn" de 1, nous isolons efficacement celles qui marquent la première occurrence d'une "Valeur" différente dans la séquence.
Approche alternative plus lente pour les valeurs dynamiques :
Si la colonne « Valeur » permet à la fois l'ordre croissant et décroissant changements, la requête suivante offre une solution plus lente, mais complète :
DECLARE @x TABLE(value INT, [time] DATETIME) INSERT @x VALUES (0,'20120615 8:03:43 PM'),-- (1,'20120615 8:03:43 PM'),--* (1,'20120615 8:03:48 PM'),-- (1,'20120615 8:03:53 PM'),-- (1,'20120615 8:03:58 PM'),-- (2,'20120615 8:04:03 PM'),--* (2,'20120615 8:04:08 PM'),-- (3,'20120615 8:04:13 PM'),--* (3,'20120615 8:04:18 PM'),-- (3,'20120615 8:04:23 PM'),-- (2,'20120615 8:04:28 PM'),--* (2,'20120615 8:04:33 PM'); ;WITH x AS ( SELECT *, rn = ROW_NUMBER() OVER (ORDER BY time) FROM @x ) SELECT x.value, x.[time] FROM x LEFT OUTER JOIN x AS y ON x.rn = y.rn + 1 AND x.value <> y.value WHERE y.value IS NOT NULL;
Cette requête utilise une série de JOIN et de filtres pour identifier les changements de valeur, ce qui donne une liste de moments où la « Valeur » a été modifiée.
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!