Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengenalpasti Baris Dengan Cekap Di Mana Nilai Lajur Berubah dalam SQL?

Bagaimanakah Saya Boleh Mengenalpasti Baris Dengan Cekap Di Mana Nilai Lajur Berubah dalam SQL?

Linda Hamilton
Linda Hamiltonasal
2024-12-25 02:56:101011semak imbas

How Can I Efficiently Identify Rows Where a Column Value Changes in 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!

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