Pertanyaan SQL menggunakan GROUP BY
dan MAX(DATE)
[Soalan pendua]
Soalan:
Dapatkan destinasi terkini setiap kereta api berdasarkan masa berlepas maksimumnya dari jadual yang diberikan. Output yang dikehendaki harus mengecualikan destinasi pendua sambil mengekalkan masa terkini.
Data sampel:
<code>火车 目的地 时间 1 HK 10:00 1 SH 12:00 1 SZ 14:00 2 HK 13:00 2 SH 09:00 2 SZ 07:00</code>
Keputusan yang dijangkakan:
<code>火车 目的地 时间 1 SZ 14:00 2 HK 13:00</code>
Percubaan awal:
Gunakan pertanyaan GROUP BY
mudah dan MAX(Time)
:
SELECT Train, Dest, MAX(Time) FROM TrainTable GROUP BY Train
Ralat:
Pertanyaan ini menghasilkan ralat "ora-00979 bukan ungkapan GROUP BY" yang menunjukkan bahawa lajur Dest
juga mesti disertakan dalam pernyataan GROUP BY
. Walau bagaimanapun, ini akan menghasilkan destinasi pendua untuk setiap kereta api.
Penyelesaian:
Untuk mencapai hasil yang diinginkan, pertanyaan yang lebih kompleks boleh digunakan:
SELECT train, dest, time FROM ( SELECT train, dest, time, RANK() OVER (PARTITION BY train ORDER BY time DESC) dest_rank FROM traintable ) where dest_rank = 1
Pertanyaan ini mula-mula menggunakan fungsi RANK
untuk mengira kedudukan setiap kereta api bagi setiap destinasi dalam susunan menurun masa berlepas. Klausa PARTITION BY train
memastikan kedudukan dilakukan dalam setiap kumpulan kereta api. Akhir sekali, pertanyaan hanya mendapatkan semula rekod yang dest_rank
bersamaan dengan 1, menapis destinasi pendua dengan berkesan dan hanya mengekalkan destinasi terkini untuk setiap kereta api.
Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Destinasi Terkini untuk Setiap Kereta Api Menggunakan `GROUP BY` dan `MAX(DATE)` SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!