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!