Masalah:
Andaikan anda mempunyai jadual dengan dua lajur: Nilai dan Masa. Anda ingin mengenal pasti baris di mana lajur Nilai telah berubah. Dalam erti kata lain, anda perlu mencari detik apabila nilai yang disimpan berubah, dilambangkan dengan baris berbintang.
Penyelesaian:
Satu pendekatan untuk menyelesaikan masalah ini melibatkan memanfaatkan tetingkap fungsi dan nombor baris dalam pernyataan SQL:
Perkenalkan Nombor Baris:
WITH x AS ( SELECT value, time, rn = ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time) FROM dbo.table )
Langkah ini memperkenalkan lajur baharu yang dipanggil rn (nombor baris) yang memberikan nombor jujukan unik kepada setiap baris dalam setiap partition Nilai, dalam tertib menaik Masa.
Kenal pasti Perubahan:
SELECT * FROM x WHERE rn = 1;
Pertanyaan ini menapis hasil untuk hanya memasukkan baris dengan rn bersamaan dengan 1. Ini ialah baris pertama dalam setiap partition Nilai, yang mewakili permulaan perubahan nilai.
Pertimbangan Tambahan untuk Atas dan Bawah Nilai:
Jika lajur Nilai boleh meningkat dan menurun, pendekatan yang lebih kompleks diperlukan:
Buat Jadual Sementara:
DECLARE @x TABLE(value INT, [time] DATETIME) INSERT @x VALUES (0,'20120615 8:03:43 PM'), (1,'20120615 8:03:43 PM'), (1,'20120615 8:03:48 PM'), (1,'20120615 8:03:53 PM'), (1,'20120615 8:03:58 PM'), (2,'20120615 8:04:03 PM'), (2,'20120615 8:04:08 PM'), (3,'20120615 8:04:13 PM'), (3,'20120615 8:04:18 PM'), (3,'20120615 8:04:23 PM'), (2,'20120615 8:04:28 PM'), (2,'20120615 8:04:33 PM');
Buat jadual sementara dengan data sampel untuk menggambarkan proses.
Perkenalkan Nombor Baris (Sekali lagi):
WITH x AS ( SELECT *, rn = ROW_NUMBER() OVER (ORDER BY time) FROM @x )
Kenalpasti Perubahan Nilai:
SELECT x.value, x.[time] FROM x LEFT OUTER JOIN x AS y ON x.rn = y.rn + 1 AND x.value <> y.value WHERE y.value IS NOT NULL;
Pertanyaan ini melakukan cantuman luar kiri antara jadual dengan nombor baris dan versi dianjak sendiri (y) untuk menyemak perubahan dalam lajur Nilai antara baris bersebelahan. Baris dengan nilai bukan NULL untuk nilai y mewakili perubahan.
Atas ialah kandungan terperinci Bagaimanakah SQL Boleh Mengenalpasti Perubahan dalam Nilai Lajur Dari Masa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!