Считать в течение скользящего периода - PullRequest
0 голосов
/ 04 мая 2020

Это продолжение моего предыдущего вопроса . Вопрос похож на мой первоначальный, с дополнительным поворотом, который я хотел бы видеть количество предыдущих сервисов за установленный период работы. Допустим, у меня есть таблица:

id | client |date    | service
1  |     1  | 1/2010 | A
2  |     1  | 1/2011 | A
3  |     1  | 1/2012 | A
4  |     1  | 1/2015 | A

Я могу подсчитать, сколько раз каждая служба выполнялась до определенной даты, используя ROW_NUMBER() OVER (PARTITION BY client, service ORDER BY date) - 1, но как мне go узнать о запросе, показывающем количество услуг? выполнено до указанной даты, но также и в течение определенного скользящего периода?

Итак, скажем, я хотел бы знать, сколько услуг типа А было оказано только за последние 2 года. Ожидаемый результат будет:

client |date    | no of prior services
    1  |1/2010  | 0
    1  |1/2011  | 1
    1  |1/2012  | 2
    1  |1/2015  | 0 - no earlier services within the last two years.

То, что у меня есть, выглядит примерно так:

select table0.*, count(table1.date)
from table table0
left outer join table table1
  ON table0.client = table1.client
 AND table0.date > table1.date
 AND table1.date > DATEADD(year, -3, table0.date)

Но, похоже, это не работает ..

1 Ответ

1 голос
/ 04 мая 2020

Вот запрос, основанный на таблицах из вашего предыдущего вопроса (к которому я присоединился в CTE для удобства).

WITH CTE AS (
  SELECT b.bill_id, b.person_id, b.bill_date, bd.service_type
  FROM billing b
  JOIN billing_detail bd ON bd.bill_id = b.bill_id
)
SELECT c1.person_id, c1.bill_date, c1.service_type,
       COUNT(c2.bill_date) AS prior_services
FROM CTE c1
LEFT JOIN CTE c2 ON c2.person_id = c1.person_id
                AND c2.service_type = c1.service_type
                AND c2.bill_date >= DATEADD(YEAR, -2, c1.bill_date) 
                AND c2.bill_date < c1.bill_date
GROUP BY c1.person_id, c1.bill_date, c1.service_type

Демонстрация по dbfiddle

...