Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Cekap Mencari Nilai Minimum dan Maksimum setiap Kumpulan dalam SQL Tanpa Menggunakan Fungsi Kedudukan?

Bagaimana untuk Cekap Mencari Nilai Minimum dan Maksimum setiap Kumpulan dalam SQL Tanpa Menggunakan Fungsi Kedudukan?

Linda Hamilton
Linda Hamiltonasal
2024-12-23 22:32:17738semak imbas

How to Efficiently Find Minimum and Maximum Values per Group in SQL Without Using Ranking Functions?

Dapatkan Nilai Tertinggi dan Terkecil bagi setiap Kumpulan

Gambaran Keseluruhan

Tutorial ini menangani persoalan bagaimana untuk mendapatkan semula rekod dengan nilai tertinggi atau terkecil untuk medan tertentu dalam setiap kumpulan, tanpa bergantung pada kedudukan (@Rank). Walaupun soalan awal ini menggunakan @Rank sebagai penyelesaian, respons seterusnya menunjukkan pendekatan yang lebih cekap menggunakan gabungan.

Penyelesaian

Untuk mendapatkan baris dengan OrderField tertinggi bagi setiap kumpulan, gunakan bahagian luar kiri sertai dan pertanyaan berikut:

SELECT t1.*
FROM `Table` AS t1
LEFT OUTER JOIN `Table` AS t2
  ON t1.GroupId = t2.GroupId AND t1.OrderField < t2.OrderField
WHERE t2.GroupId IS NULL
ORDER BY t1.OrderField;

Jika berbilang rekod mempunyai OrderField yang sama dalam kumpulan dan anda memerlukan salah satu daripada mereka, anda boleh melanjutkan syarat seperti berikut:

SELECT t1.*
FROM `Table` AS t1
LEFT OUTER JOIN `Table` AS t2
  ON t1.GroupId = t2.GroupId 
        AND (t1.OrderField < t2.OrderField 
         OR (t1.OrderField = t2.OrderField AND t1.Id < t2.Id))
WHERE t2.GroupId IS NULL

Pertanyaan yang diperhalusi ini memastikan bahawa t1 dikembalikan hanya apabila tiada baris lain t2 wujud dalam kumpulan GroupId yang sama yang mempunyai nilai OrderField yang lebih tinggi atau OrderField yang sama. dengan nilai Id yang lebih rendah. Oleh itu, ia secara berkesan mendapatkan semula baris dengan OrderField terhebat dalam setiap kumpulan.

Pengoptimuman

Menggunakan pendekatan gabungan luar kiri boleh meningkatkan prestasi pertanyaan dengan ketara berbanding kaedah terdahulu yang melibatkan @Rank dan subquery. Sambungan luar kiri boleh memanfaatkan indeks pada (GroupId, OrderField) untuk akses yang dioptimumkan.

Awas mengenai @Rank

Pendekatan awal menggunakan @Rank mungkin tidak berfungsi seperti yang diharapkan kerana fakta bahawa @Kenaikan pangkat diteruskan selepas jadual pertama diproses. Untuk menetapkan semula @Rank kepada sifar antara jadual, anda perlu memperkenalkan jadual terbitan tambahan, tetapi ini boleh mengakibatkan pengoptimuman yang lemah.

Atas ialah kandungan terperinci Bagaimana untuk Cekap Mencari Nilai Minimum dan Maksimum setiap Kumpulan dalam SQL Tanpa Menggunakan Fungsi Kedudukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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