Mengira Perbezaan Nilai Baris Berturut-turut dalam SQL
Pertanyaan pangkalan data selalunya melibatkan lebih daripada mendapatkan semula data yang mudah. Menentukan perbezaan antara nilai dalam baris berturut-turut memberikan cabaran yang sama. Artikel ini memperincikan kaedah yang cekap untuk mengira perbezaan ini dalam SQL, memfokuskan pada senario di mana susunan baris tidak berurutan sepenuhnya.
Contoh Senario:
Bayangkan jadual dengan nilai integer, tidak semestinya disusun secara berurutan oleh pengecam baris:
<code>rowInt | Value --------+------ 2 | 23 3 | 45 17 | 10 9 | 0</code>
Objektifnya adalah untuk mengira perbezaan antara setiap Value
dan Value
baris berikut serta-merta, menghasilkan:
<code>rowInt | Value | Diff --------+--------+------ 2 | 23 | 22 3 | 45 | -35 9 | 0 | -45 17 | 10 | 10</code>
Pendekatan SQL Server 2005 (Fungsi Pra-Tetingkap):
Sebelum pengenalan fungsi tetingkap, SQL Server 2005 bergantung pada kaedah yang kurang cekap yang menggabungkan subkueri dan fungsi agregat:
<code class="language-sql">SELECT [current].rowInt, [current].Value, ISNULL([next].Value, 0) - [current].Value AS Diff FROM sourceTable AS [current] LEFT JOIN ( SELECT MIN(rowInt) AS rowInt, Value FROM sourceTable WHERE rowInt > [current].rowInt GROUP BY Value ) AS [next] ON [next].rowInt = [current].rowInt</code>
Penjelasan:
ISNULL()
mengendalikan kes di mana tiada baris berikutnya wujud, lalai kepada 0.rowInt
dan Value
baris seterusnya.Value
baris semasa daripada Value
baris seterusnya.Pertimbangan Prestasi:
Teknik yang lebih lama ini boleh menjadi tidak cekap untuk set data yang besar kerana beberapa imbasan jadual yang terlibat. SQL moden menawarkan lebih banyak penyelesaian yang dioptimumkan.
Atas ialah kandungan terperinci Bagaimana untuk Mengira Perbezaan Nilai Baris-ke-Baris dengan Cekap dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!