Di Sqlite 3 saya mencoba mencari cara memilih baris berdasarkan nilai minimum. Saya pikir saya dibatasi oleh tidak cukup tahu tentang terminologi terkait untuk mencari google secara efektif.
Tabelnya terlihat seperti:
num text num2
---------- ---------- ----------
0 a 1
0 a 2
1 a 3
1 b 4
Saya ingin mendapatkan baris mana num2
adalah 1, 2
, dan 4
. Saya ingin melakukan seleksi berdasarkan nilai minimum num untuk setiap nilai unik kolom teks.
Jadi, untuk text = 'a'
, nilai minimumnya num
adalah 0
, jadi saya ingin baris 1 dan 2. Untuk text = 'b'
, nilai minimumnya num
adalah 1
, jadi saya ingin baris 4
.
Dengan menggunakan berbagai kombinasi grup, saya dapat memperoleh baris 1
dan 2
atau baris 1
dan 4
. Saya merasa seperti kehilangan komponen SQL yang akan melakukan apa yang saya inginkan, tetapi saya belum dapat menemukan apa yang bisa dilakukan.
Apa cara yang tepat untuk melakukan jenis permintaan ini?
Kemungkinan Solusi
Saya telah menemukan sebuah cara untuk melakukan ini. Saya tidak cukup memiliki reputasi untuk menjawab pertanyaan saya sendiri, jadi saya melakukan pembaruan di sini. Saya tidak yakin apakah selalu benar atau seperti apa efisiensi itu. Setiap komentar dipersilakan.
Saya menggunakan pernyataan pemilihan majemuk, di mana satu kueri menemukan nilai minimum num untuk setiap nilai teks yang unik:
sqlite> select num, text from t group by text having num = min( num );
num text
---------- ----------
0 a
1 b
Kemudian saya bergabung dengan tabel lengkap ini untuk mendapatkan semua baris yang cocok dengan dua kolom ini.
sqlite> with u as
( select num, text from t group by text having num = min( num ) )
select t.* from t join u on t.num = u.num and t.text = u.text;
num text num2
---------- ---------- ----------
0 a 1
0 a 2
1 b 4
u
kueri disimpan dalam tabel sementara, terlepas dari apakah itu ditulis sebagai CTE, tampilan, atau inline sebagai subquery.Saya cenderung melakukan hal ini dengan bergabung dengan diri luar:
Ini pada dasarnya mengatakan; beri saya semua catatan yang tidak memiliki nilai lebih tinggi yaitu nol.
sumber
Jadi, bagaimana Anda dapat menemukan jawaban untuk pertanyaan Anda sendiri di waktu berikutnya? Menurut pendapat saya, itu adalah dengan menguraikan dan mengikuti logika. Dan Anda benar:
Ini diterjemahkan menjadi:
(Ini harus setara dengan
having
permintaan Anda . Mungkin menarik untuk melihat baris yangnum
sama dengan NULL. Lebih tepat: Lihat apa efek yang dimiliki baris dengan nol, yang mungkin ingin Anda saring terlebih dahulu dengan awhere num is not null
)Dari sini Anda dapat mencapai hasil yang diinginkan dengan:
Atau menggunakan gabungan:
Dan ketika kinerja tidak cukup untuk tabel Anda, mulailah melihat pernyataan yang lebih kompleks.
sumber
Bukankah seharusnya ini permintaan yang persis Anda butuhkan?
sumber
num2
nilainya unik.