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

Memilih baris pertama per grup

SELECT  a, b, c
FROM    (
        SELECT  *, ROW_NUMBER() OVER (PARTITION BY a ORDER BY b, c) rn
        FROM    mytable
        ) q
WHERE   rn = 1
ORDER BY
        a

atau

SELECT  mi.*
FROM    (
        SELECT  DISTINCT  a
        FROM    mytable
        ) md
CROSS APPLY
        (
        SELECT  TOP 1 *
        FROM    mytable mi
        WHERE   mi.a = md.a
        ORDER BY
                b, c
        ) mi
ORDER BY
        a

Buat indeks komposit pada (a, b, c) agar kueri bekerja lebih cepat.

Mana yang lebih efisien tergantung pada distribusi data Anda.

Jika Anda memiliki beberapa nilai yang berbeda dari a tetapi banyak catatan dalam setiap a , kueri kedua akan lebih baik.

Anda dapat meningkatkannya lebih jauh lagi dengan membuat tampilan yang diindeks:

CREATE VIEW v_mytable_da
WITH   SCHEMABINDING
AS
       SELECT  a, COUNT_BIG(*) cnt
       FROM    dbo.mytable
       GROUP BY
               a

GO

CREATE UNIQUE CLUSTERED INDEX
       pk_vmytableda_a
ON     v_mytable_da (a)

GO

SELECT  mi.*
FROM    v_mytable_da md
CROSS APPLY
        (
        SELECT  TOP 1 *
        FROM    mytable mi
        WHERE   mi.a = md.a
        ORDER BY
                b, c
        ) mi
ORDER BY
        a


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mendapatkan Kuartal kalender dari tanggal di TSQL

  2. Mengisi tanggal yang hilang berdasarkan grup

  3. Aktifkan Agen SQL Server melalui SSMS

  4. Versi backend tidak didukung untuk mendesain diagram atau tabel database

  5. Bagaimana cara mencegah pemicu database berulang?