Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

group_concat в SQL Server 2008

В SQL Server от версия 2005 и по-нова можете да използвате CTE (общ табличен израз) с ROW_NUMBER функция за премахване на дубликати:

;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

Този CTE "разделя" вашите данни по UserID и за всеки дял, ROW_NUMBER функцията раздава последователни числа, започващи от 1 и подредени по Created DESC - така че последният ред получава RowNum = 1 (за всеки UserID ), което избирам от CTE в оператора SELECT след него.

Използвайки същия CTE, можете лесно да изтриете дубликати:

;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

Прилага се същият принцип:вие „групирате“ (или разделяте) данните си по някакъв критерий, номерирате последователно всички редове за всеки дял от данни, а тези със стойности, по-големи от 1 за „номера на разделения ред“, се отстраняват от 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. Инсталация на Business Intelligence Development Studio 2008

  2. Как да опишем низове, завършващи с едно или две числа в един модел LIKE?

  3. Тригер, който актуализира само вмъкнатия ред

  4. Как да прехвърля криптирани съхранени процедури от онлайн база данни към локална?

  5. Има ли недостатъци при използването на VARCHAR(MAX) в таблица?