为了简单起见,我们假设我有两个表。
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运行一份1月至4月期间的服务类型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).
这可能涉及到两张表的某种自连接,但我疲惫的鸟脑目前似乎想不出答案。 任何帮助都将被感激。
你可以使用 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'
或类似的。