Maison > base de données > tutoriel mysql > Comment identifier efficacement les lignes avec des changements de valeur à l'aide de ROW_NUMBER() ?

Comment identifier efficacement les lignes avec des changements de valeur à l'aide de ROW_NUMBER() ?

Patricia Arquette
Libérer: 2025-01-02 14:25:43
original
960 Les gens l'ont consulté

How to Efficiently Identify Rows with Value Changes Using ROW_NUMBER()?

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;
Copier après la connexion

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;
Copier après la connexion

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!

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