COUNT 次指定时间之前,自加入?
COUNT number of times prior to specified time, self-join?
为简单起见,假设我有两个 table:
billing
具有以下字段 bill_id
(主、唯一键、整数)、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
table 包含:
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
table 包含:
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).
这可能涉及在两个 table 上进行某种自连接,但我疲惫的鸟脑目前似乎无法想出答案。任何帮助将不胜感激。
您可以在 person_id
和 service_type
上使用 ROW_NUMBER()
以获得您想要的结果,减去 1 使值从 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'
或类似。
为简单起见,假设我有两个 table:
billing
具有以下字段 bill_id
(主、唯一键、整数)、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
table 包含:
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
table 包含:
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).
这可能涉及在两个 table 上进行某种自连接,但我疲惫的鸟脑目前似乎无法想出答案。任何帮助将不胜感激。
您可以在 person_id
和 service_type
上使用 ROW_NUMBER()
以获得您想要的结果,减去 1 使值从 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'
或类似。