Запрос на датировку между строками, в которых значение не изменилось, сгруппированных по значению - PullRequest
1 голос
/ 16 марта 2020

Я ищу запрос к таблице счетов, которая также отслеживает, какие "программные" клиенты были во время их покупок (не лучший способ сохранить это, но это то, что есть, и мне остается иметь дело с этим).

Мне бы хотелось узнать, как долго каждый клиент был в каждой программе.

Например, вот история покупок, сделанных парой клиентов. Мы видим, что клиенты были на разных программах в разные даты. Обратите внимание, что идентификаторы программ на самом деле не являются последовательными (возможно, они запускаются в программе с более высоким идентификатором, чем в следующей программе).

invoices table:

cust_id, prog_id, datetime
1,       1,       2020-01-01      < cust 1 first seen on program 1
2,       1,       2020-01-05      < cust 2 first seen on program 1
1,       1,       2020-02-07
1,       2,       2020-02-08      < cust 1 seen on program 2 after 38 days
2,       1,       2020-02-10
2,       2,       2020-02-15      < cust 2 seen on program 2 after 41 days
1,       2,       2020-02-15
2,       2,       2020-02-15
1,       2,       2020-02-22
1,       3,       2020-02-28      < cust 1 seen on program 3 after 20 days
2,       2,       2020-03-05
2,       2,       2020-03-07
2,       3,       2020-03-15      < cust 2 seen on program 3 after 29 days
2,       3,       2020-03-17

Я хотел бы видеть что-то подобное (сделано в моей голове, надеюсь, математика проверяется):

cust_id, prg_id, days_on_prog
1,       1,      38
1,       2,      20
2,       1,      41
2,       2,      29
2,       3,      2

Обратите внимание, что клиента 1 больше не видели в программе 3 чем один раз, поэтому у нас нет программы days_on_prog для них в программе 3.

Можете ли вы помочь мне создать такой запрос?

1 Ответ

0 голосов
/ 16 марта 2020

Похоже, что агрегация должна делать эту работу:

select
    cust_id,
    prg_id,
    datediff(max(datetime), min(datetime)) days_on_prog
from invoices
having max(datetime) <> min(datetime)
group by cust_id, prg_id
order by cust_id, prg_id
...