Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengenalpasti Baris Dengan Cekap Di Mana Nilai Lajur Berubah dalam SQL?
Memilih Baris Di Mana Nilai Lajur Telah Berubah: Teknik SQL
Menentukan keadaan di mana nilai lajur mengalami peralihan adalah operasi kritikal dalam pelbagai senario analisis data. Artikel ini meneroka teknik untuk mengenal pasti perubahan sedemikian dalam jadual dengan cekap.
Pernyataan Masalah
Pertimbangkan jadual berikut dengan lajur "Nilai" dan "Masa":
Value | Time | |
---|---|---|
0 | 15/06/2012 8:03:43 PM | |
1 | 15/06/2012 8:03:43 PM | * |
1 | 15/06/2012 8:03:48 PM | |
1 | 15/06/2012 8:03:53 PM | |
1 | 15/06/2012 8:03:58 PM | * |
2 | 15/06/2012 8:04:03 PM | * |
2 | 15/06/2012 8:04:08 PM | |
3 | 15/06/2012 8:04:13 PM | * |
3 | 15/06/2012 8:04:18 PM | |
3 | 15/06/2012 8:04:23 PM | |
2 | 15/06/2012 8:04:28 PM | * |
2 | 15/06/2012 8:04:33 PM |
Tugasnya ialah untuk mengenal pasti baris yang ditandakan dengan "*," yang menunjukkan peralihan dalam "Nilai" lajur.
Penyelesaian
Menggunakan Fungsi Tetingkap (SQL Server 2012 dan Lebih Tinggi)
Dengan fungsi tetingkap yang diperkenalkan dalam SQL Server 2012, operasi ini boleh dilakukan dengan cekap:
;WITH x AS ( SELECT value, time, rn = ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time) FROM dbo.table ) SELECT * FROM x WHERE rn = 1;
Pertanyaan ini mengira nombor baris dalam setiap partition "Nilai" dan memilih baris pertama (rn = 1) untuk setiap partition.
Menggunakan Table Joins (SQL Server 2008 dan Terdahulu)
Untuk versi SQL Server sebelum 2012, pendekatan berikut boleh digunakan:
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'); ;WITH x AS ( SELECT *, rn = ROW_NUMBER() OVER (ORDER BY time) FROM @x ) 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 penyambungan sendiri pada jadual, membandingkan baris bersebelahan untuk mengenal pasti perubahan nilai. Ia memerlukan pembolehubah jadual yang berasingan untuk menyimpan hasil perantaraan.
Nota: Walaupun fungsi tetingkap menawarkan prestasi yang lebih baik, ia mungkin tidak tersedia dalam semua versi SQL Server. Pilih pendekatan yang paling sesuai dengan versi dan keperluan prestasi anda.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengenalpasti Baris Dengan Cekap Di Mana Nilai Lajur Berubah dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!