Maison >base de données >tutoriel mysql >Comment récupérer efficacement les lignes où la valeur d'une colonne change dans SQL Server ?

Comment récupérer efficacement les lignes où la valeur d'une colonne change dans SQL Server ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-24 19:58:18522parcourir

How to Efficiently Retrieve Rows Where a Column Value Changes in SQL Server?

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!

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