COUNT指定时间之前的次数,自连接?

问题描述 投票:0回答:1

为了简单起见,我们假设我有两个表。

billing 有以下字段 bill_id (主键,唯一键,int)。person_id, bill_datebilling_detail 含有 bill_idservice_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).

这可能涉及到两张表的某种自连接,但我疲惫的鸟脑目前似乎想不出答案。 任何帮助都将被感激。

sql sql-server-2016 self-join
1个回答
2
投票

你可以使用 ROW_NUMBER() 在...上 person_idservice_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上演示

© www.soinside.com 2019 - 2024. All rights reserved.