Artikel ini meneroka fungsi tetingkap SQL, dikategorikan sebagai ranking, agregat, dan fungsi nilai. Ia memperincikan penggunaan mereka dalam mengira jumlah yang berjalan dan membincangkan implikasi prestasi dan keserasian dengan pelbagai jenis gabungan. Focu utama
Fungsi tetingkap dalam SQL memperluaskan keupayaan fungsi agregat standard dengan membenarkan pengiraan merentasi satu set baris jadual yang berkaitan dengan baris semasa. Mereka tidak mengelompokkan baris ke dalam hasil yang lebih kecil seperti GROUP BY
tidak; Sebaliknya, mereka beroperasi pada "tetingkap" baris yang ditakrifkan oleh PARTITION BY
dan ORDER BY
klausa. Terdapat tiga kategori utama:
ORDER BY
klausa. Contohnya termasuk RANK()
, ROW_NUMBER()
, DENSE_RANK()
, NTILE()
. RANK()
boleh menetapkan pangkat yang sama kepada pelbagai baris jika mereka mempunyai nilai yang sama dalam lajur pesanan, manakala ROW_NUMBER()
memberikan pangkat yang unik kepada setiap baris, walaupun mereka terikat. DENSE_RANK()
memberikan pangkat berturut -turut tanpa jurang, melangkau pangkat yang akan ditugaskan untuk ikatan. NTILE()
membahagikan baris ke dalam bilangan kumpulan tertentu.SUM
, AVG
, MIN
, MAX
, COUNT
) di seluruh tingkap baris. Perbezaan utama dari fungsi agregat standard ialah mereka mengembalikan nilai untuk setiap baris dalam set hasil, bukan satu nilai agregat tunggal bagi setiap kumpulan. Sebagai contoh, SUM() OVER (PARTITION BY department ORDER BY salary)
akan mengira jumlah gaji kumulatif bagi setiap jabatan, yang diperintahkan oleh gaji.LAG()
dan LEAD()
adalah contoh biasa, mengambil nilai dari baris sebelum atau menggantikan baris semasa. FIRST_VALUE()
dan LAST_VALUE()
Ambil nilai pertama dan terakhir dalam tetingkap. Ini berguna untuk membandingkan nilai baris kepada jirannya atau mencari maklumat kontekstual. Jumlah yang dijalankan, juga dikenali sebagai jumlah kumulatif, mudah dikira menggunakan fungsi tetingkap. Komponen teras ialah fungsi tetingkap agregat SUM()
digabungkan dengan ORDER BY
klausa.
Katakan kita mempunyai jadual yang dipanggil sales
dengan date
dan amount
lajur. Untuk mengira jumlah jualan yang berjalan untuk setiap hari:
<code class="sql">SELECT date, amount, SUM(amount) OVER (ORDER BY date) as running_total FROM sales;</code>
Pertanyaan ini memerintahkan jualan mengikut tarikh dan kemudian, untuk setiap baris, SUM(amount) OVER (ORDER BY date)
mengira jumlah amount
untuk semua baris sehingga dan termasuk baris semasa.
Jika anda ingin mengira jumlah yang dijalankan dibahagikan dengan kategori tertentu (misalnya, kategori produk), anda akan menambah PARTITION BY
klausa:
<code class="sql">SELECT product_category, date, amount, SUM(amount) OVER (PARTITION BY product_category ORDER BY date) as running_total_by_category FROM sales;</code>
Ini akan memberikan jumlah yang berasingan bagi setiap product_category
.
Walaupun fungsi tetingkap berkuasa, mereka boleh memberi kesan kepada prestasi pertanyaan, terutamanya dalam pertanyaan kompleks atau pada dataset yang besar. Implikasi prestasi bergantung pada beberapa faktor:
PARTITION BY
dan ORDER BY
klausa, terutamanya yang melibatkan pelbagai lajur atau lajur yang tidak diindeks, dapat meningkatkan masa pemprosesan dengan ketara. Pengindeksan yang cekap adalah penting untuk prestasi.Untuk mengurangkan masalah prestasi:
PARTITION BY
dan ORDER BY
klausa adalah penting.PARTITION BY
dan ORDER BY
klausa semudah mungkin.Ya, fungsi tingkap boleh digunakan dengan pelbagai jenis gabungan, tetapi definisi tingkap perlu dipertimbangkan dengan teliti. Tingkap ditakrifkan selepas operasi gabungan.
Sebagai contoh, jika anda mempunyai dua jadual, orders
dan customers
, menyertai customer_id
, anda boleh menggunakan fungsi tetingkap untuk mengira jumlah nilai pesanan untuk setiap pelanggan:
<code class="sql">SELECT o.order_id, c.customer_name, o.order_value, SUM(o.order_value) OVER (PARTITION BY c.customer_id) as total_customer_value FROM orders o JOIN customers c ON o.customer_id = c.customer_id;</code>
Di sini, SUM(o.order_value) OVER (PARTITION BY c.customer_id)
mengira jumlah nilai pesanan untuk setiap pelanggan selepas operasi JOIN
telah menggabungkan data dari kedua -dua jadual. PARTITION BY
klausa memastikan bahawa jumlah dikira secara berasingan untuk setiap pelanggan. Prinsip yang sama berlaku untuk jenis gabungan lain (gabungan kiri, gabungan kanan, gabungan luar penuh). Kuncinya ialah fungsi tetingkap beroperasi pada set hasil yang dihasilkan oleh gabungan itu.
Atas ialah kandungan terperinci Apakah pelbagai jenis fungsi tetingkap dalam SQL (kedudukan, agregat, nilai)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!