Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wybierz wiersze, w których zmieniła się wartość kolumny

Myślę, że tego właśnie szukasz:

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

Może to być powolne, jeśli zestaw wyników jest duży i nie ma dobrego indeksu pomocniczego...

EDYTUJ

Ach, poczekaj chwilę, wartości rosną i maleją, a nie tylko w górę... w takim przypadku możesz spróbować znacznie wolniejszego podejścia:

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;

Wyniki:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przekonanie do regularnego serwisowania serwera SQL

  2. Uzyskaj ostatni rekord z każdego miesiąca

  3. Jak uzyskać aktualne rekordy na podstawie ich daty wejścia w życie?

  4. Threading w CLR w SQL Server 2008

  5. SQL Server ORDER BY data i wartości null trwają