Saya memiliki tabel yang merupakan entri koleksi ketika pengguna login.
username, date, value
--------------------------
brad, 1/2/2010, 1.1
fred, 1/3/2010, 1.0
bob, 8/4/2009, 1.5
brad, 2/2/2010, 1.2
fred, 12/2/2009, 1.3
etc..
Bagaimana cara membuat kueri yang akan memberi saya tanggal terbaru untuk setiap pengguna?
Pembaruan: Saya lupa bahwa saya perlu memiliki nilai yang sesuai dengan tanggal terbaru.
sql
greatest-n-per-group
kepala ikan
sumber
sumber
Jawaban:
sumber
max(date)
akan mengembalikan tanggal yang akan bergabung dengan banyak catatan). Untuk menghindari masalah ini, akan lebih baik menggunakan solusi @ dotjoe: stackoverflow.com/a/2411763/4406793 .Menggunakan fungsi jendela (berfungsi di Oracle, Postgres 8.4, SQL Server 2005, DB2, Sybase, Firebird 3.0, MariaDB 10.3)
sumber
username
, dalam hal ini) dan bahkan tidak memerlukan bidang "pesanan" yang unik (seperti bergabungmax(date)
dalam jawaban lain).order by date desc, id desc)
.Saya melihat sebagian besar pengembang menggunakan kueri sebaris tanpa mempertimbangkan dampaknya pada data yang sangat besar.
Cukup, Anda dapat mencapai ini dengan:
sumber
Untuk mendapatkan seluruh baris yang berisi tanggal maks untuk pengguna:
sumber
sumber
Dari pengalaman saya, cara tercepat adalah mengambil setiap baris yang tidak ada baris baru dalam tabel.
Keuntungan lain adalah bahwa sintaks yang digunakan sangat sederhana, dan bahwa makna kueri agak mudah untuk dipahami (ambil semua baris sehingga tidak ada baris baru untuk nama pengguna yang dipertimbangkan).
TIDAK ADA
ROW_NUMBER
INNER BERGABUNG
LEFT OUTER BERGABUNG
sumber
SELECT username, value FROM t WHERE NOT EXISTS ( SELECT * FROM t AS witness WHERE witness.date > t.date AND witness.username = t.username );
Yang ini harus memberi Anda hasil yang benar untuk pertanyaan Anda yang diedit.
Sub-permintaan memastikan untuk menemukan hanya baris dari tanggal terbaru, dan bagian luar
GROUP BY
akan mengurus ikatan. Ketika ada dua entri untuk tanggal yang sama untuk pengguna yang sama, itu akan mengembalikan entri dengan yang tertinggivalue
.sumber
Anda juga bisa menggunakan Fungsi Peringkat analitis
sumber
Akan mengatasi masalah yang diperbarui. Ini mungkin tidak bekerja dengan baik pada tabel besar, bahkan dengan pengindeksan yang baik.
sumber
sumber
Untuk Oracle mengurutkan hasil yang ditetapkan dalam urutan menurun dan mengambil catatan pertama, sehingga Anda akan mendapatkan catatan terbaru:
sumber
sumber
sumber
Select * from table1 where lastest_date=(select Max(latest_date) from table1 where user=yourUserName)
Kueri Batin akan mengembalikan tanggal terbaru untuk pengguna saat ini, Kueri luar akan menarik semua data sesuai dengan hasil kueri batin.
sumber
Saya menggunakan cara ini untuk mengambil catatan terakhir untuk setiap pengguna yang saya miliki di meja saya. Itu adalah permintaan untuk mendapatkan lokasi terakhir untuk salesman sesuai dengan waktu terakhir terdeteksi pada perangkat PDA.
sumber
sumber
Kompilasi kecil saya
join
lebih baik daripada bersarangselect
group by
tidak memberi Andaprimary key
yang lebih disukaijoin
partition by
dalam hubungannya denganfirst_value
( docs )Jadi, inilah pertanyaannya:
Pro:
where
pernyataan menggunakan kolom apa sajaselect
setiap kolom dari baris yang difilterCons:
sumber
Saya melakukan sedikit untuk aplikasi saya karena:
Di bawah ini adalah kueri:
sumber
Ini mirip dengan salah satu jawaban di atas, tetapi menurut saya itu jauh lebih sederhana dan lebih rapi. Juga, menunjukkan penggunaan yang baik untuk pernyataan silang berlaku. Untuk SQL Server 2005 dan di atasnya ...
sumber
sumber
Ini juga harus berfungsi untuk mendapatkan semua entri terbaru untuk pengguna.
sumber
Anda akan menggunakan fungsi agregat MAX dan GROUP BY
sumber
value
, bukan yang terkait denganMAX(date)
baris.