Dapatkan baris terbesar dalam partition dengan cekap dan elakkan akses jadual berlebihan
Dalam bidang pertanyaan data, kecekapan adalah penting, terutamanya apabila berurusan dengan jadual besar. Cabaran pengoptimuman yang biasa adalah untuk mencari baris dengan nilai terbesar dalam lajur tertentu daripada setiap partition jadual.
Andaikan kita perlu mendapatkan markah yang diperolehi oleh setiap ID dalam pusingan terkini (PUSINGAN) daripada jadual SKOR:
ID | ROUND | SCORE |
---|---|---|
1 | 1 | 3 |
1 | 2 | 6 |
1 | 3 | 2 |
2 | 1 | 10 |
2 | 2 | 12 |
3 | 1 | 6 |
Kaedah awal:
Salah satu cara ialah mendapatkan semula semua baris dan kemudian menapis baris yang tidak mewakili PUSINGAN maksimum setiap ID:
<code class="language-sql">SELECT * FROM (SELECT id, round, CASE WHEN (MAX(round) OVER (PARTITION BY id)) = round THEN score ELSE NULL END score FROM SCORES where id in (1,2,3) ) scorevals WHERE scorevals.round is not null;</code>
Walaupun kaedah ini berkesan, ia tidak cekap kerana imbasan jadual yang berlebihan.
Pelan pengoptimuman:
Satu lagi cara yang lebih cekap ialah menggunakan fungsi tetingkap dan klausa DISTINCT:
<code class="language-sql">SELECT DISTINCT id ,max(round) OVER (PARTITION BY id) AS round ,first_value(score) OVER (PARTITION BY id ORDER BY round DESC) AS score FROM SCORES WHERE id IN (1,2,3) ORDER BY id;</code>
Dalam kaedah ini, fungsi tetingkap max(round) OVER (PARTITION BY id)
mengira PUSINGAN maksimum untuk setiap ID. Kemudian gunakan klausa DISTINCT selepas fungsi tetingkap, memastikan hanya baris PUSINGAN tertinggi untuk setiap ID dikembalikan. Akhir sekali, fungsi tetingkap first_value(score) OVER (PARTITION BY id ORDER BY round DESC)
mendapatkan semula SKOR pertama yang dikaitkan dengan ROUND terbesar untuk setiap ID.
Skim yang dioptimumkan ini mencapai hasil yang diinginkan tanpa memerlukan beberapa imbasan jadual, meningkatkan prestasi dengan ketara.
Atas ialah kandungan terperinci Bagaimana untuk Memilih Baris Maks dengan Cekap daripada Pemisahan Tanpa Imbasan Jadual Berbilang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!