Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server, намерете произволна последователност от стойности

Това ще избере всички клиенти с поне две последователни действия от един и същи тип.

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
        )

Ето по-ефективната заявка само за действие 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
        )

Актуализация 2:

За да изберете непрекъснати диапазони:

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

Тази заявка изчислява две серии:едната връща непрекъснати ORDER BY lastlogin , вторият разделя чрез action допълнително:

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

Докато разликата между двете схеми е еднаква, сериите са непрекъснати. Всяко прекъсване прекъсва серията.

Това означава, че комбинацията от (action, diff ) дефинира непрекъснатите групи.

Можем да групираме по action, diff , намерете MAX и MIN в рамките на групите и филтрирайте по тях.

Ако трябва да изберете 14 редове, а не 14 последователни дни, просто филтрирайте по COUNT(*) вместо 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. 6 проблемни заявки, които значително забавят вашата база данни

  2. Правилният начин за прилагане на уникално ограничение, което позволява множество NULL стойности в SQL Server

  3. Разбиране на проблема с мръсното четене със SQL Server

  4. Изберете непразни колони с помощта на SQL Server

  5. sumProduct в sql