
Mengira Perbezaan Antara Baris Berturut-turut dalam Jadual Pangkalan Data Menggunakan SQL
Katakan anda mempunyai jadual pangkalan data dengan integer bukan urutan sebagai pengecam baris (rowInt) dan nilai berangka (Value). Cabarannya ialah untuk mengira perbezaan antara Value baris berturut-turut dengan cekap menggunakan SQL.
Pertanyaan mudah seperti ini akan mendapatkan semula data:
<code class="language-sql">SELECT * FROM myTable ORDER BY rowInt;</code>
Namun, kita perlu mengira dan memaparkan perbezaannya. Format output yang dikehendaki ialah:
<code>rowInt Value Diff 2 23 22 --45-23 3 45 -35 --10-45 9 10 -45 --0-45 17 0 0 --0 (or NULL, depending on desired behavior)</code>
Berikut ialah cara untuk mencapai ini menggunakan sambung diri dengan subkueri:
<code class="language-sql">SELECT
c.rowInt,
c.Value,
ISNULL(n.Value, 0) - c.Value AS Diff
FROM
myTable AS c
LEFT JOIN
myTable AS n ON n.rowInt = (SELECT MIN(rowInt) FROM myTable WHERE rowInt > c.rowInt)
ORDER BY c.rowInt;</code>Pertanyaan ini melaksanakan LEFT JOIN jadual (myTable) pada dirinya sendiri, alias sebagai c (semasa) dan n (seterusnya). Subkueri dalam klausa ON mendapati minimum rowInt lebih besar daripada baris semasa rowInt, dengan berkesan mengenal pasti baris seterusnya. ISNULL(n.Value, 0) mengendalikan kes di mana tiada baris seterusnya (untuk baris terakhir), menggantikan 0 untuk n.Value yang hilang. Perbezaan itu kemudiannya dikira dan dialiaskan sebagai Diff. Klausa akhir ORDER BY memastikan keputusan dibentangkan dalam susunan yang betul. Sebagai alternatif, anda boleh menggunakan COALESCE dan bukannya ISNULL. Pilihan bergantung pada sistem pangkalan data khusus anda.
Atas ialah kandungan terperinci Bagaimana untuk Mengira Perbezaan Nilai Antara Baris Berturut-turut dalam Jadual Pangkalan Data Menggunakan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!