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

group_concat w SQL Server 2008

W SQL Server od wersji 2005 i nowszych można użyć CTE (Common Table Expression) z ROW_NUMBER funkcja eliminacji duplikatów:

;WITH LastPerUser AS
(
   SELECT 
       ID, UserID, ClassID, SchoolID, Created,
       ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY Created DESC) AS 'RowNum'
   FROM dbo.YourTable
)
SELECT 
   ID, UserID, ClassID, SchoolID, Created,
FROM LastPerUser
WHERE RowNum = 1

To CTE „partycjonuje” Twoje dane według UserID , a dla każdej partycji ROW_NUMBER funkcja rozdaje kolejne numery, zaczynając od 1 i uporządkowane przez Created DESC - więc najnowszy wiersz otrzymuje RowNum = 1 (dla każdego UserID ), który wybieram z CTE w poleceniu SELECT po nim.

Korzystając z tego samego CTE, możesz również łatwo usuwać duplikaty:

;WITH LastPerUser AS
(
   SELECT 
       ID, UserID, ClassID, SchoolID, Created,
       ROW_NUMBER() OVER(PARTITION BY UserID ORDER BY Created DESC) AS 'RowNum'
   FROM dbo.YourTable
)
DELETE FROM dbo.YourTable t
FROM LastPerUser cte
WHERE t.ID = cte.ID AND cte.RowNum > 1

Obowiązuje ta sama zasada:„grupujesz” (lub partycjonujesz) dane według pewnych kryteriów, kolejno numerujesz wszystkie wiersze dla każdej partycji danych, a te z wartościami większymi niż 1 dla „numeru wiersza partycjonowanego” są usuwane przez DELETE .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Napraw „nazwa profilu jest nieprawidłowa” podczas wysyłania poczty z serwera SQL

  2. Wybierz w oświadczeniu, gdzie źródłem jest inna baza danych

  3. Jak uruchomić pakiety dtsx za pomocą wiersza poleceń?

  4. Obsługa Spotlight Cloud dla ogłoszenia o usłudze Azure SQL DB (wersja zapoznawcza)

  5. Jak wybrać rekordy, które nie istnieją na serwerze SQL?