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

Для простоты предположим, что у меня есть две таблицы:

billing со следующими полями bill_id (первичный, уникальный ключ, int), person_id, bill_date и billing_detail, содержащие bill_id и service_type.

Прежде всего, я хотел бы получить список клиентов (person_id), которым выставлен счет за определенный спектр услуг в данный период, поэтому просто

SELECT billing.person_id, billing.bill_date
FROM   billing
INNER JOIN billing_detail ON billing.bill_id = billing_detail.bill_id
WHERE      billing_detail.service_type IN (list of services)
  AND      billing.bill_date between some_date and another_date

Что я хотел бы сделать сейчас, так это показать, сколько раз данному клиенту был выставлен счет за один и тот же набор услуг ДО данной даты.

Скажем, таблица billing содержит:

1  | 1 | 1/1/2020
2  | 1 | 1/2/2020
3  | 1 | 1/3/2020
4  | 1 | 1/4/2020
4  | 1 | 2/4/2020

И таблица billing_detail содержит:

1  |  A
2  |  B
3  |  A
4  |  B
5  |  A

Так что, если бы я должен был запустить отчет для клиента 1 за период с января по апрель для типа обслуживания A, ожидаемый результат будет

1 | 1/1/2020 | 0 (no A type service prior to this date)
1 | 1/3/2020 | 1 (One A type service prior to this date)
1 | 2/4/2020 | 2 (Two A type services prior ot this date).

Это, вероятно, предполагает какое-то самостоятельное соединение за обоими столами, но мой уставший птичий мозг не может найти ответ в данный момент. Любая помощь будет оценена.

1 Ответ

2 голосов
/ 04 мая 2020

Вы можете использовать ROW_NUMBER() вместо person_id и service_type, чтобы получить желаемый результат, вычитая единицу, чтобы начать значения с 0:

SELECT person_id, bill_date, service_type,
       ROW_NUMBER() OVER (PARTITION BY person_id, service_type ORDER BY bill_date) - 1 AS prior_services
FROM billing b
JOIN billing_detail bd ON bd.bill_id = b.bill_id

Это даст вам данные для всех типы услуг:

person_id   bill_date   service_type    prior_services
1           2020-01-01  A               0
1           2020-01-03  A               1
1           2020-02-04  A               2
1           2020-01-02  B               0
1           2020-01-04  B               1

Чтобы ограничить тип услуги, добавьте

WHERE service_type = 'A'

или аналогичный.

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

...