Saya perlu query database SQL untuk menemukan semua nilai yang berbeda dari satu kolom dan saya butuh nilai arbitrer dari kolom lain. Misalnya, perhatikan tabel berikut dengan dua kolom, kunci dan nilai:
key value
=== =====
one test
one another
one value
two goes
two here
two also
three example
Saya ingin mendapatkan kembali satu baris sampel, dipilih secara sewenang-wenang, dari setiap kunci yang berbeda, mungkin mendapatkan tiga baris ini:
key value
=== =====
one test
two goes
three example
Bagaimana saya bisa merumuskan permintaan seperti itu di SQL?
Jawaban:
Permintaan termudah untuk menulis adalah untuk MySQL (dengan pengaturan ANSI tidak ketat). Ini menggunakan konstruksi non-standar:
Dalam versi terbaru (5.7 dan 8.0+) di mana pengaturan yang ketat dan
ONLY_FULL_GROUP_BY
default, Anda dapat menggunakanANY_VALUE()
fungsi, ditambahkan dalam 5.7: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
danvalue
):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()
danMAX()
tidak bekerja dengan beberapa tipe data di beberapa DBMS (seperti bit, teks, gumpalan):PostgreSQL memiliki
DISTINCT ON
operator non-standar khusus yang juga dapat digunakan. OpsionalORDER BY
adalah untuk memilih baris mana dari setiap grup yang harus dipilih:sumber
ORDER BY whatever
di ypercube dengan panggilan ke fungsi untuk mengacak hasilnya.Untuk Server MS-SQl:
Demikian juga, Anda bisa memiliki rownum = 2 untuk set hasil kedua Anda
sumber
Mirip dengan jawaban yang diterima, tetapi alih-alih min () atau maks () Anda dapat menggunakan array_agg ()
Anda dapat memesan nilai secara opsional di dalam array untuk memilih yang terbesar atau yang terkecil:
(dicentang pada PostgreSQL)
sumber