sql - GROUP BY 外键和日期范围

标签 sql postgresql

我正在使用一个名为 appointments 的表,其中的列是:

scheduled_at: 日期时间 doctor_id:整数 描述:文字 finished_at:日期时间

我想获得所有已完成的约会的计数,这些约会按 doctor_id 分组,并按一组日期间隔分组,这些日期间隔因给定的输入集而异。我得到的输入是:from 是一个日期,to 也是一个日期。

我要解决的第一个用例是从给定的 fromto 中按月拆分结果。因此,如果我得到 from = '2018-02-03' 和 to = '2018-10-03' 我想获得所有约会的 COUNT从 2018-022018-10,每个医生和每个月都已完成。

我知道如何按 doctor_id 进行分组,但我不知道如何按这些动态日期间隔进行分组。

这是我目前所拥有的:

选择计数(*) 从约会 WHERE finished_at 不为空 按 doctor_id 分组

我知道如果我事先有时间间隔,我可以做尽可能多的查询,所以我最终会每个月做一个查询,例如:

选择计数(*) 从约会 WHERE finished_at 不为空 AND scheduled_at BETWEEN '2018-02-01' AND '2018-03-01' 按 doctor_id 分组

选择计数(*) 从约会 WHERE finished_at 不为空 AND scheduled_at BETWEEN '2018-03-01' AND '2018-04-01' 按 doctor_id 分组

我只是想知道是否有一种方法可以在 SQL 中执行此操作,所以我只需要执行一个查询。

最佳答案

使用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年和月的查询:

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)

关于sql - GROUP BY 外键和日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53780250/

相关文章:

postgresql - @ 在 Postgres 函数调用中做什么?

python - 为什么这个Python错误代码是: Too Few parameters. Expected1。 (-3010) 使用 pyodbc 时发生?

php - MySQL 使用 'random' 数字作为主键

java - 一起使用SQLite可读可写数据库

mysql - 如何检索一个表中不同项目的数量,以便在另一个表中为每个用户和每个项目存储一个 bool 值?

sql - 无法找出确切的 PostgreSQL 查询

sql - 数据库 PL/SQL

postgresql - 更改 rdsadmin 用户创建的架构的权限

sql - 针对大量列进行 Un-Pivoting Postgres

database - Rails 上所有请求中的随机 "SELECT 1"查询