Sélection de lignes avec des changements de valeur à l'aide de ROW_NUMBER
Dans le contexte d'un tableau où la colonne de valeur reflète un état changeant au fil du temps, en sélectionnant le les moments où cette valeur a changé peuvent être une tâche analytique précieuse. Cet article présente une solution utilisant la fonction ROW_NUMBER pour identifier de telles lignes, en considérant les deux scénarios dans lesquels les valeurs peuvent augmenter ou fluctuer.
Solution pour augmenter les valeurs
En supposant que les valeurs ne peuvent augmenter, nous employons l'approche suivante :
;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;
La fonction ROW_NUMBER partitionne la table par la valeur colonne et attribue des numéros consécutifs aux lignes dans l'ordre de leurs valeurs temporelles au sein de chaque partition. En sélectionnant les lignes où ROW_NUMBER est 1, nous récupérons la première occurrence de chaque valeur distincte, ce qui signifie un changement de valeur.
Solution pour les valeurs fluctuantes
Quand les valeurs peut fluctuer, nous adaptons notre approche pour répondre à cette complexité :
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;
Dans ce cas, nous attribuons ROW_NUMBERS à l'intégralité de l'ensemble de données par ordre chronologique. Nous effectuons ensuite un LEFT OUTER JOIN de la table avec elle-même, en faisant correspondre les lignes avec des ROW_NUMBERS consécutifs et des valeurs non égales. Le résultat garantit la sélection uniquement des lignes qui ont une valeur distincte dans la ligne suivante.
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!