sql >> Database teknologi >  >> RDS >> Sqlserver

Vælg rækker, hvor kolonneværdien er ændret

Jeg tror, ​​det er det, du leder efter:

;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;

Dette kan være langsomt, hvis resultatsættet er stort, og der ikke er et godt understøttende indeks...

REDIGER

Ah, vent et øjeblik, værdierne går op og ned, ikke kun op... hvis det er tilfældet, kan du prøve denne meget langsommere tilgang:

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;

Resultater:

value  time
-----  -----------------------
1      2012-06-15 20:03:43.000
2      2012-06-15 20:04:03.000
3      2012-06-15 20:04:13.000
2      2012-06-15 20:04:28.000


  1. Undslippe MYSQL-kommandolinjer via Bash Scripting

  2. Kyrillisk kodning i C#

  3. MySQL dobbelt type sammenligning mislykkes

  4. Simpelt kan lide/ikke lide vurderingssystem i php og MySQL