Nama | Tarikh | jam | Mengira |
---|---|---|---|
Kilang | 2022-07-17 | 23 | 12 |
Kilang | 2022-07-18 | 00 | 15 |
Kilang | 2022-07-18 | 01 | 20 |
Kilang | 2022-07-18 | 02 | 22 |
Kilang | 2022-07-18 | 03 | 25 |
Kilang | 2022-07-18 | 04 | 20 |
Kilang | 2022-07-18 | 05 | 22 |
Kilang | 2022-07-18 | 06 | 25 |
Mike | 2022-07-18 | 00 | 15 |
Mike | 2022-07-18 | 01 | 20 |
Mike | 2022-07-18 | 02 | 22 |
Mike | 2022-07-18 | 03 | 25 |
Mike | 2022-07-18 | 04 | 20 |
Jadual input semasa saya menyimpan maklumat kiraan yang direkodkan secara berterusan setiap jam dalam sehari. Saya perlu mengekstrak perbezaan nilai kiraan berturut-turut, tetapi kerana saya terpaksa menggunakan MySQL 5.7, saya menghadapi masalah melakukan ini.
Pertanyaan yang saya tulis adalah seperti berikut:
SET @cnt := 0; SELECT Name, Date, Hours, Count, (@cnt := @cnt - Count) AS DiffCount FROM Hourly ORDER BY Date;
Ini tidak memberikan hasil yang tepat.
Saya ingin mendapatkan output berikut:
Nama | Tarikh | jam | Mengira | Perbezaan |
---|---|---|---|---|
Kilang | 2022-07-17 | 23 | 12 | 0 |
Kilang | 2022-07-18 | 00 | 15 | 3 |
Kilang | 2022-07-18 | 01 | 20 | 5 |
Kilang | 2022-07-18 | 02 | 22 | 2 |
Kilang | 2022-07-18 | 03 | 25 | 3 |
Kilang | 2022-07-18 | 04 | 20 | 5 |
Kilang | 2022-07-18 | 05 | 22 | 2 |
Kilang | 2022-07-18 | 06 | 25 | 3 |
Mike | 2022-07-18 | 00 | 15 | 0 |
Mike | 2022-07-18 | 01 | 20 | 5 |
Mike | 2022-07-18 | 02 | 22 | 2 |
Mike | 2022-07-18 | 03 | 25 | 3 |
Mike | 2022-07-18 | 04 | 20 | 5 |
Mike | 2022-07-18 | 05 | 22 | 2 |
Mike | 2022-07-18 | 06 | 25 | 3 |
Sila cadangkan apa yang saya kurang.
Cuba yang berikut:
Lihat demo daripada db-fiddle.
Dalam MySQL 5.7, anda boleh mengemas kini pembolehubah sebaris untuk mengandungi nilai "Count" yang dikemas kini. Memandangkan anda perlu menetapkan semula pembolehubah apabila nilai "Nama" berubah, anda boleh menggunakan pembolehubah lain yang mengandungi nilai sebelumnya "Nama". Kemudian gunakan fungsi
IF
untuk menyemak:Ia akan berfungsi dengan fungsi
ABS
a>, menggunakan nilai mutlak kepada perbezaan.Lihat demo di sini.
Dalam MySQL 8.0 anda boleh menggunakan sesuatu seperti
LAG
untuk mendapatkan output dengan lancar. Ia akan berfungsi dengan:ABS
Gunakan nilai perbezaan mutlak,COALESCE
digunakan untuk mengeluarkan nilai nol pertama.Lihat demo di sini.