[英]GROUP BY foreign_key and date range
我正在使用称为appointments
的表,这些表是:
cheduled_at:datetime doctor_id:整数描述:文本finished_at:datetime
我想获得按doctor_id
分组的所有约会的doctor_id
,以及根据一组日期间隔分组的所有约会的doctor_id
,这些时间间隔根据给定的输入集而变化。 我得到的输入是: from
它是一个日期, to
这也是一个日期。
第一次使用情况下,我想解决由月从给定的拆分结果from
和to
。 因此,如果我from
='2018-02-03' to
='2018-10-03',我想获取每个医生以及从2018-02
到2018-02
每个月完成的所有约会的计数2018-10
。
我知道如何按Doctor_id进行分组,但是我不知道如何对这些动态日期间隔进行分组。
这是我到目前为止的内容:
SELECT COUNT(*) FROM appointments WHERE finished_at IS NOT NULL GROUP BY doctor_id
我知道,如果事先有间隔,我可以执行尽可能多的查询,因此最终我每个月都要进行一次查询,例如:
SELECT COUNT(*) FROM appointments WHERE finished_at IS NOT NULL AND scheduled_at BETWEEN '2018-02-01' AND '2018-03-01' GROUP BY doctor_id
SELECT COUNT(*) FROM appointments WHERE finished_at IS NOT NULL AND scheduled_at BETWEEN '2018-03-01' AND '2018-04-01' GROUP BY doctor_id
我只是想知道是否有一种方法可以在SQL中做到这一点,所以我只需要执行一个查询。
您可以使用条件聚合:
SELECT doctor_id,
SUM(CASE WHEN scheduled_at BETWEEN '2018-02-01' AND '2018-03-01' THEN 1 ELSE 0 END),
SUM(CASE WHEN scheduled_at BETWEEN '2018-03-01' AND '2018-04-01' THEN 1 ELSE 0 END)
FROM appointments
WHERE finished_at IS NOT NULL
GROUP BY doctor_id
用case
表达式进行条件聚合 :
SELECT doctor_id,
COUNT(*),
COUNT(case when scheduled_at BETWEEN '2018-02-01' AND '2018-03-01' then 1 end),
COUNT(case when scheduled_at BETWEEN '2018-03-01' AND '2018-04-01' then 1 end)
FROM appointments
WHERE finished_at IS NOT NULL
GROUP BY doctor_id
或者也有group by
年和月group by
的查询:
SELECT doctor_id, year(scheduled_at), month(scheduled_at), COUNT(*)
FROM appointments
WHERE finished_at IS NOT NULL
GROUP BY doctor_id, year(scheduled_at), month(scheduled_at)
或者,也许应该使用ANSI SQL函数EXTRACT
:
SELECT doctor_id,
extract(year from scheduled_at), extract(month from scheduled_at), COUNT(*)
FROM appointments
WHERE finished_at IS NOT NULL
GROUP BY doctor_id, extract(year from scheduled_at), extract(month from scheduled_at)
如果您的postgres版本是9.4或更高版本,则应考虑使用FILTER谓词,它比case语句更易于阅读且性能更高。
SELECT doctor_id,
COUNT(*) AS total,
COUNT(*) FILTER (WHERE scheduled_at BETWEEN '2018-02-01' AND '2018-03-01') AS date_feb,
COUNT(*) FILTER (WHERE scheduled_at BETWEEN '2018-03-01' AND '2018-04-01') AS date_mar
FROM appointments
WHERE finished_at IS NOT NULL
GROUP BY doctor_id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.