Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana Anda mengidentifikasi urutan pola catatan dalam catatan menggunakan TSQL?

Anda dapat menggunakan kueri berikut yang dibungkus dengan CTE untuk menetapkan nomor urut ke nilai yang terkandung dalam urutan Anda:

;WITH Seq AS (
    SELECT v, ROW_NUMBER() OVER(ORDER BY k) AS rn
    FROM (VALUES(1, 5), (2, 9), (3, 6)) x(k,v)
)

Keluaran:

v   rn
-------
5   1
9   2
6   3

Menggunakan CTE di atas Anda dapat mengidentifikasi pulau, yaitu irisan baris berurutan yang berisi seluruh urutan:

;WITH Seq AS (
    SELECT v, ROW_NUMBER() OVER(ORDER BY k) AS rn
    FROM (VALUES(1, 5), (2, 9), (3, 6)) x(k,v)
), Grp AS (
SELECT [Key], [Value], 
       ROW_NUMBER() OVER (ORDER BY [Key]) - rn AS grp            
FROM mytable AS m
LEFT JOIN Seq AS s ON m.Value = s.v
)
SELECT *
FROM Grp

Keluaran:

    Key Value   grp
   -----------------
    1   5       0
    2   9       0
    3   6       0
    6   5       3
    7   9       3
    8   6       3

grp field membantu Anda mengidentifikasi dengan tepat pulau-pulau ini.

Yang perlu Anda lakukan sekarang hanyalah memfilter sebagian grup:

;WITH Seq AS (
    SELECT v, ROW_NUMBER() OVER(ORDER BY k) AS rn
    FROM (VALUES(1, 5), (2, 9), (3, 6)) x(k,v)
), Grp AS (
SELECT [Key], [Value], 
       ROW_NUMBER() OVER (ORDER BY [Key]) - rn AS grp            
FROM mytable AS m
LEFT JOIN Seq AS s ON m.Value = s.v
)
SELECT g1.[Key], g1.[Value]
FROM Grp AS g1
INNER JOIN (
   SELECT grp
   FROM Grp
   GROUP BY grp
   HAVING COUNT(*) = 3 ) AS g2
ON g1.grp = g2.grp

Demo di sini

Catatan: Versi awal dari jawaban ini menggunakan INNER JOIN ke Seq . Ini tidak akan berfungsi jika tabel berisi nilai seperti 5, 42, 9, 6 , sebagai 42 akan disaring oleh INNER JOIN dan urutan ini salah diidentifikasi sebagai salah satu yang valid. Kredit diberikan kepada @HABO untuk pengeditan ini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara paling sederhana untuk melakukan self-join rekursif?

  2. Bagaimana cara menghapus karakter ASCII yang diperluas dari string di T-SQL?

  3. Pencadangan SQL Server 2017 -3

  4. Bagaimana cara meneruskan nilai ke parameter prosedur tersimpan di komponen Sumber OLE DB?

  5. Menguasai Penggunaan Stoplist Dengan SQL Server Full-Text Search (FTS)