Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

group_concat di SQL Server 2008

Di SQL Server pada versi 2005 dan yang lebih baru, Anda dapat menggunakan CTE (Common Table Expression) dengan ROW_NUMBER fungsi untuk menghilangkan duplikat:

;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 ini "mempartisi" data Anda dengan UserID , dan untuk setiap partisi, ROW_NUMBER fungsi membagikan nomor urut, mulai dari 1 dan diurutkan berdasarkan Created DESC - jadi baris terbaru mendapat RowNum = 1 (untuk setiap UserID ) yang saya pilih dari CTE dalam pernyataan SELECT setelahnya.

Menggunakan CTE yang sama, Anda juga dapat dengan mudah menghapus duplikat:

;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

Prinsip yang sama berlaku:Anda "mengelompokkan" (atau mempartisi) data Anda dengan beberapa kriteria, Anda secara berurutan memberi nomor semua baris untuk setiap partisi data, dan yang memiliki nilai lebih besar dari 1 untuk "nomor baris yang dipartisi" disingkirkan oleh 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. Menggunakan GROUP BY dengan FIRST_VALUE dan LAST_VALUE

  2. Kapan saya harus menggunakan variabel tabel vs tabel sementara di server sql?

  3. Bagaimana saya bisa menyorot sebuah kata dalam tampilan kisi?

  4. Contoh kehidupan nyata, kapan harus menggunakan OUTER / CROSS APPLY dalam SQL

  5. Fungsi kustom dengan batasan centang SQL Server 2008