Rumah >pangkalan data >tutorial mysql >Bagaimana Mengenalpasti Baris SQL Di Mana Nilai Lajur Telah Berubah?

Bagaimana Mengenalpasti Baris SQL Di Mana Nilai Lajur Telah Berubah?

Patricia Arquette
Patricia Arquetteasal
2024-12-26 20:43:10202semak imbas

How to Identify SQL Rows Where Column Values Have Changed?

Baris Pertanyaan dengan Nilai Lajur Berubah Menggunakan SQL

Bagaimanakah seseorang boleh menentukan kejadian perubahan nilai lajur dalam jadual? Pertanyaan ini membenarkan pengecaman baris yang nilai lajur tertentu telah mengalami pengubahsuaian.

Untuk menggambarkan, pertimbangkan jadual berikut:

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     

Objektifnya adalah untuk memilih baris yang ditandakan dengan asterisk, menunjukkan perubahan nilai. Ini penting untuk menentukan selang masa yang dikaitkan dengan perubahan tersebut, yang boleh dimanfaatkan untuk pertanyaan pangkalan data lain.

Penyelesaian:

Melaksanakan pertanyaan SQL dengan fungsi tetingkap dan nombor baris, kami memperoleh yang dikehendaki baris:

;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;

Penjelasan:

  1. Fungsi ROW_NUMBER() memberikan nombor baris berjujukan dalam setiap partition berdasarkan lajur Nilai, dengan itu mewujudkan kumpulan nilai yang sama.
  2. WHERE rn = 1 keadaan berikutnya hanya memilih yang pertama baris dalam setiap kumpulan, mewakili kejadian awal setiap nilai yang berbeza.

Pertimbangan Tambahan:

  • Untuk peningkatan nilai sahaja, penyelesaiannya menjadi lebih mudah :
SELECT * FROM table WHERE value <> LAG(value) OVER (ORDER BY time);
  • Jika nilai berubah naik dan turun, pendekatan yang sedikit perlahan diperlukan:
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;

Dengan memanfaatkan kuasa fungsi tetingkap SQL, pertanyaan ini secara berkesan mendapatkan semula baris yang nilai lajur telah berubah, memberikan cerapan berharga tentang turun naik data.

Atas ialah kandungan terperinci Bagaimana Mengenalpasti Baris SQL Di Mana Nilai Lajur Telah Berubah?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn