Permintaan termudah untuk menulis adalah untuk MySQL (dengan pengaturan ANSI tidak ketat). Ini menggunakan konstruksi non-standar:
SELECT key, value
FROM tableX
GROUP BY key ;
Dalam versi terbaru (5.7 dan 8.0+) di mana pengaturan yang ketat dan ONLY_FULL_GROUP_BY
default, Anda dapat menggunakan ANY_VALUE()
fungsi, ditambahkan dalam 5.7:
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
Untuk DBMS lain, yang memiliki fungsi jendela (seperti Postgres, SQL-Server, Oracle, DB2), Anda dapat menggunakannya seperti ini. Keuntungannya adalah Anda dapat memilih kolom lain di hasilnya juga (selain key
dan value
):
SELECT key, value
FROM tableX
( SELECT key, value,
ROW_NUMBER() OVER (PARTITION BY key
ORDER BY whatever) --- ORDER BY NULL
AS rn --- for example
FROM tableX
) tmp
WHERE rn = 1 ;
Untuk versi yang lebih lama di atas dan untuk DBMS lainnya, cara umum yang bekerja hampir di semua tempat. Salah satu kelemahannya adalah Anda tidak dapat memilih kolom lain dengan pendekatan ini. Lain adalah bahwa fungsi agregat suka MIN()
dan MAX()
tidak bekerja dengan beberapa tipe data di beberapa DBMS (seperti bit, teks, gumpalan):
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
PostgreSQL memiliki DISTINCT ON
operator non-standar khusus yang juga dapat digunakan. Opsional ORDER BY
adalah untuk memilih baris mana dari setiap grup yang harus dipilih:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;