sql >> Database >  >> RDS >> Sqlserver

SQL Server, zoek een willekeurige reeks waarden

Hiermee worden alle klanten geselecteerd met ten minste twee opeenvolgende acties van hetzelfde type.

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
        )

Dit is de efficiëntere zoekopdracht voor alleen actie 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
        )

Update 2:

Ononderbroken bereiken selecteren:

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

Deze query berekent twee reeksen:één retourneert aaneengesloten ORDER BY lastlogin , de tweede partities door action bovendien:

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

Zolang het verschil tussen de twee schema's hetzelfde is, zijn de reeksen ononderbroken. Elke onderbreking doorbreekt de reeks.

Dit betekent dat de combinatie van (action, diff ) definieert de ononderbroken groepen.

We kunnen groeperen op action, diff , zoek MAX en MIN binnen de groepen en filter erop.

Als u 14 . moet selecteren rijen in plaats van 14 opeenvolgende dagen, filter gewoon op COUNT(*) in plaats van de DATEDIFF .



  1. Gegevens invoegen mysql met behulp van Ajax en PHP

  2. Converteer string met ander formaat tot op heden

  3. Hoe methoden te testen die omgaan met SQLite-database in Android?

  4. De backend van de Django-database wijzigen van MySql naar PostgreSQL