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

Jak śledzić zmiany w rekordach w SQL Server?

Jednym ze sposobów na to jest użycie ROW_NUMBER funkcja z partycjonowaniem do wykrywania, kiedy wartość Department zmiany kolumn.

Przykładowe dane

DECLARE @T TABLE (ID int, Department nvarchar(100), dt date);
INSERT INTO @T (ID, Department, dt) VALUES
(1, 'English', 'Feb 3 2017'),
(1, 'English', 'Feb 4 2017'),
(1, 'Science', 'Mar 1 2017'),
(1, 'Science', 'Apr 2 2017'),
(1, 'Maths  ', 'Apr 7 2017'),
(2, 'Maths  ', 'Feb 1 2017'),
(2, 'Maths  ', 'Apr 7 2017'),
(3, 'Maths  ', 'Apr 3 2017'),
(4, 'Science', 'Feb 1 2017'),
(4, 'Maths  ', 'Apr 7 2017');

Zapytanie

WITH
CTE
AS
(
    SELECT
        ID
        ,Department
        ,dt
        ,ROW_NUMBER() OVER (PARTITION BY ID, Department ORDER BY dt DESC) AS rnPart
        ,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY dt DESC) AS rnID
    FROM @T
)
SELECT
    ID
    ,Department
    ,dt
FROM CTE
WHERE
    rnPart = 1
    AND rnID <> 1
ORDER BY
    ID
    ,dt
;

Wynik

+----+------------+------------+
| ID | Department |     dt     |
+----+------------+------------+
|  1 | English    | 2017-02-04 |
|  1 | Science    | 2017-04-02 |
|  4 | Science    | 2017-02-01 |
+----+------------+------------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dostawca OLE DB Microsoft.ACE.OLEDB.12.0 dla serwera połączonego (null) zwrócił komunikat Zakładka jest nieprawidłowa.

  2. SQL Bulk Insert z parametrem FIRSTROW pomija następujący wiersz

  3. Jak wygenerować losową liczbę dla każdego wiersza w zaznaczeniu T-SQL?

  4. SQL Server - kopiuj procedury składowane z jednej bazy danych do drugiej

  5. Zwróć dwa zestawy wyników przy użyciu WITH TempResults AS