sql >> Databáze >  >> RDS >> Sqlserver

Vyberte řádky, ve kterých se změnila hodnota sloupce

Myslím, že to je to, o co vám jde:

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

To může být pomalé, pokud je sada výsledků velká a neexistuje dobrý podpůrný index...

UPRAVIT

Ach, počkejte chvíli, hodnoty jdou nahoru a dolů, nejen nahoru... pokud je to váš případ, můžete zkusit tento mnohem pomalejší přístup:

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;

Výsledky:

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. Jak použít řetězec PHP v dotazu LIKE mySQL?

  2. Seřadit podle součtu dvou polí

  3. oracle-inline pohled

  4. Vytvoření DDL pro základní linii pro průlet