Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Memilih Baris Maks dengan Cekap daripada Pemisahan Tanpa Imbasan Jadual Berbilang?

Bagaimana untuk Memilih Baris Maks dengan Cekap daripada Pemisahan Tanpa Imbasan Jadual Berbilang?

Susan Sarandon
Lepaskan: 2025-01-21 08:19:09
asal
447 orang telah melayarinya

How to Efficiently Select the Max Row from Partitions Without Multiple Table Scans?

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan