Rumah >pangkalan data >tutorial mysql >Bagaimana Mengenalpasti Baris dengan Perubahan Nilai Dengan Cekap Menggunakan ROW_NUMBER()?

Bagaimana Mengenalpasti Baris dengan Perubahan Nilai Dengan Cekap Menggunakan ROW_NUMBER()?

Patricia Arquette
Patricia Arquetteasal
2025-01-02 14:25:43946semak imbas

How to Efficiently Identify Rows with Value Changes Using ROW_NUMBER()?

Memilih Baris dengan Perubahan Nilai Menggunakan ROW_NUMBER

Dalam konteks jadual di mana lajur nilai mencerminkan keadaan berubah dari semasa ke semasa, memilih detik apabila nilai itu berubah boleh menjadi tugas analisis yang berharga. Artikel ini membentangkan penyelesaian menggunakan fungsi ROW_NUMBER untuk mengenal pasti baris sedemikian, mengambil kira kedua-dua senario di mana nilai boleh meningkat atau turun naik.

Penyelesaian untuk Meningkatkan Nilai

Andaikan nilai hanya boleh meningkat, kami menggunakan pendekatan berikut:

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

ROW_NUMBER fungsi membahagikan jadual dengan lajur nilai dan memberikan nombor berturut-turut kepada baris mengikut susunan nilai masanya dalam setiap partition. Dengan memilih baris dengan ROW_NUMBER ialah 1, kami mendapatkan kejadian pertama bagi setiap nilai yang berbeza, yang menandakan perubahan dalam nilai.

Penyelesaian untuk Nilai Berubah-ubah

Apabila nilai boleh berubah-ubah, kami menyesuaikan pendekatan kami untuk menangani kerumitan ini:

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;

Dalam kes ini, kami menetapkan ROW_NUMBERS kepada keseluruhan set data dalam susunan kronologi. Kami kemudian melakukan LEFT OUTER JOIN pada jadual dengan dirinya sendiri, memadankan baris dengan ROW_NUMBERS berturut-turut dan nilai tidak sama. Hasilnya memastikan pemilihan hanya baris yang mempunyai nilai yang berbeza dalam baris berikut.

Atas ialah kandungan terperinci Bagaimana Mengenalpasti Baris dengan Perubahan Nilai Dengan Cekap Menggunakan ROW_NUMBER()?. 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