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

SQL Server, temukan urutan nilai yang berubah-ubah

Ini akan memilih semua pelanggan dengan setidaknya dua tindakan berturut-turut dari jenis yang sama.

WITH    rows AS 
        (
        SELECT  customer, action,
                ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
        FROM    mytable
        )
SELECT  DISTINCT customer
FROM    rows rp
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    rows rl
        WHERE   rl.customer = rp.customer
                AND rl.rn = rp.rn + 1
                AND rl.action = rp.action
        )

Inilah kueri yang lebih efisien untuk tindakan 2 :

WITH    rows AS 
        (
        SELECT  customer, ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
        FROM    mytable
        WHERE   action = 2
        )
SELECT  DISTINCT customer
FROM    rows rp
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    rows rl
        WHERE   rl.customer = rp.customer
                AND rl.rn = rp.rn + 1
        )

Pembaruan 2:

Untuk memilih rentang tanpa gangguan:

WITH    rows AS 
        (
        SELECT  customer, action, lastlogin
                ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
                ROW_NUMBER() OVER (PARTITION BY customer, action ORDER BY lastlogin) AS series
        FROM    mytable
        )
SELECT  DISTINCT customer
FROM    (
        SELECT  customer
        FROM    rows rp
        WHERE   action
        GROUP BY
                customer, actioncode, series - rn
        HAVING
                DETEDIFF(day, MIN(lastlogin), MAX(lastlogin)) >= 14
        ) q

Kueri ini menghitung dua seri:satu mengembalikan ORDER BY lastlogin yang berdekatan , yang kedua dipartisi dengan action tambahan:

action  logindate rn  series diff = rn - series
1       Jan 01    1   1      0
1       Jan 02    2   2      0
2       Jan 03    3   1      2
2       Jan 04    4   2      2
1       Jan 05    5   3      2
1       Jan 06    6   4      2

Selama perbedaan antara kedua skema sama, rangkaian tidak terputus. Setiap interupsi merusak rangkaian.

Ini berarti bahwa kombinasi dari (action, diff ) mendefinisikan grup yang tidak terputus.

Kita dapat mengelompokkan berdasarkan action, diff , cari MAX dan MIN dalam grup dan memfilternya.

Jika Anda perlu memilih 14 baris daripada 14 hari berturut-turut, cukup filter di COUNT(*) alih-alih DATEDIFF .



  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 Memperbaiki Error Msg 7325 di SQL Server:"Objek yang mengekspos kolom dengan tipe CLR tidak diizinkan dalam kueri terdistribusi"

  2. Tidak dapat memulai transaksi terdistribusi

  3. Cara Mengubah Susunan Level Server dari Menjalankan Instance SQL Server

  4. Cara Menangani Kesalahan dalam Transaksi Bersarang SQL Server

  5. Bagaimana cara menambahkan Batasan Default ke Kolom yang ada di Tabel SQL Server - Tutorial SQL Server / TSQL Bagian 91