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

Идентифициране на потребители с низходяща тенденция SQL

Това е малко сложно и за да намерите резултати, които постоянно се увеличават или намаляват, вероятно ще искате да използвате MATCH_RECOGNIZE клауза, която MySQL (все още) не поддържа. По този начин можете да дефинирате модел, при който всяко количество е по-малко от предишната стойност. Освен това вероятно бихте могли да направите това с рекурсивен cte, но това би било извън моите способности.

Ето какво измислих, с уговорката, че сравнява само първата и последната стойност:

WITH
    tbl (customer, purchasedate, quantity) AS (
SELECT * FROM VALUES 
    ('Bob',         '9/1/2021',        10),
    ('Bob',         '9/10/2021',       6),
    ('Bob',         '9/18/2021',       5),
    ('Bob',         '9/19/2021',       8),
    ('Mary',        '9/1/2021',        10),
    ('Mary',        '9/10/2021',       6),
    ('Mary',        '9/18/2021',       5),
    ('Mary',        '9/19/2021',       3),
    ('Frank',       '9/1/2021',        5),
    ('Lucus',       '9/1/2021',        5),
    ('Lucus',       '9/10/2021',       6),
    ('Lucus',       '9/18/2021',       10)
)

SELECT
    DISTINCT customer
FROM
    tbl
QUALIFY
      FIRST_VALUE(quantity) OVER (partition BY customer ORDER BY purchasedate)
    > LAST_VALUE(quantity)  OVER (PARTITION BY customer ORDER BY purchasedate)

Което дава:

CUSTOMER
Bob
Mary

Или, за да получите стриктно намаляване с известен максимум, можете да ги свържете всички заедно, което става доста грозно:

WITH
    tbl (customer, purchasedate, quantity) AS (
SELECT * FROM VALUES 
    ('Bob',         '9/1/2021',        10),
    ('Bob',         '9/10/2021',       6),
    ('Bob',         '9/18/2021',       5),
    ('Bob',         '9/19/2021',       8),
    ('Mary',        '9/1/2021',        10),
    ('Mary',        '9/10/2021',       6),
    ('Mary',        '9/18/2021',       5),
    ('Mary',        '9/19/2021',       3),
    ('Frank',       '9/1/2021',        5),
    ('Lucus',       '9/1/2021',        5),
    ('Lucus',       '9/10/2021',       6),
    ('Lucus',       '9/18/2021',       10)
)

SELECT
    DISTINCT customer
FROM
    tbl
    qualify 
        (NTH_VALUE(quantity, 1) OVER (partition BY customer ORDER BY purchasedate) >= NTH_VALUE(quantity, 2) OVER (partition BY customer ORDER BY purchasedate))
        and ((NTH_VALUE(quantity, 2) OVER (partition BY customer ORDER BY purchasedate) >= NTH_VALUE(quantity, 3) OVER (partition BY customer ORDER BY purchasedate)) or (NTH_VALUE(quantity, 3) OVER (partition BY customer ORDER BY purchasedate) is null))
        and ((NTH_VALUE(quantity,3) OVER (partition BY customer ORDER BY purchasedate) >= NTH_VALUE(quantity, 4) OVER (partition BY customer ORDER BY purchasedate)) or (NTH_VALUE(quantity, 4) OVER (partition BY customer ORDER BY purchasedate) is null))

Което дава:

CUSTOMER
Mary

Въпреки че за неизвестна сума бих си помислил match_recognize би било най-доброто решение (или можете да добавите някаква рекурсия или персонализирана функция).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка при изтриване на няколко реда

  2. java.lang.IllegalStateException:Опит за изпълнение на операция на затворена EntityManagerFactory

  3. MySql:ПОРЪЧАЙТЕ ПО родител и дете

  4. Как да вмъкнете няколко реда от текстово поле в MySQL

  5. Как да активирам INNODB в mysql