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
Lepaskan: 2024-12-25 02:56:10
asal
1147 orang telah melayarinya

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;
Salin selepas log masuk

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;
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan