繁体   English   中英

GROUP BY外键和日期范围

[英]GROUP BY foreign_key and date range

我正在使用称为appointments的表,这些表是:

cheduled_at:datetime doctor_id:整数描述:文本finished_at:datetime

我想获得按doctor_id分组的所有约会的doctor_id ,以及根据一组日期间隔分组的所有约会的doctor_id ,这些时间间隔根据给定的输入集而变化。 我得到的输入是: from它是一个日期, to这也是一个日期。

第一次使用情况下,我想解决由月从给定的拆分结果fromto 因此,如果我from ='2018-02-03' to ='2018-10-03',我想获取每个医生以及从2018-022018-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM