我在mysql中有一家医院的数据库,其中的列为:id,entry_date,exit_date(最后两列是医院患者的进入和退出)。 我想计算给定月份中每一天的患者人数
用于计算给定日期的ID数量的代码相对简单(如上所述),但是整个月的每一天的计数我都不知道该怎么做。
Day 2019-09-01: x patients
Day 2019-09-02: y patients
Day 2019-09-03: z patients
.
.
.
x + y + z + ... = total patients on each day for all days of september
SELECT Count(id) AS patientsday
FROM saps
WHERE entry_date <= '2019-05-02'
AND ( exit_date > '2019-05-02'
OR exit_date IS NULL )
AND hospital = 'X'
答案 0 :(得分:1)
首先,假设每天至少有一个病人进入该医院,我将写一个临时表,其中包含所有可能的日期,称为all_dates。
第二,我将创建一个临时表,将您拥有的表与all_dates连接起来。在这种情况下,想法是复制ID。对于患者在医院内的每一天,您的桌子上都会有与这一天相关的ID。例如,在您的表格看起来像这样之前:
id entry_date exit_date
1 2019-01-01 2019-01-05
2 2019-01-03 2019-01-04
3 2019-01-10 2019-01-15
有了连接的表,您的表将如下所示:
id possible_dates
1 2019-01-01
1 2019-01-02
1 2019-01-03
1 2019-01-04
1 2019-01-05
2 2019-01-03
2 2019-01-04
3 2019-01-10
3 2019-01-11
3 2019-01-12
3 2019-01-13
3 2019-01-14
3 2019-01-15
最后,您要做的就是计算每天有多少个ID。
以下是此解决方案的完整查询:
WITH all_dates AS (
SELECT distinct entry_date as possible_dates
FROM your_table_name
),
patients_per_day AS (
SELECT id
, possible_dates
FROM all_dates ad
LEFT JOIN your_table_name di
ON ad.possible_dates BETWEEN di.entry_date AND di.exit_date
)
SELECT possible_dates, COUNT(ID)
FROM patients_per_day
GROUP BY 1
另一种可能的解决方案,采用几乎相同的策略,仅更改联接的条件是查询波纹管:
WITH all_dates AS (
SELECT distinct entry_date as possible_dates
FROM your_table_name
),
date_intervals AS (
SELECT id
, entry_date
, exit_date
, datediff(entry_date, exite_date) as date_diference
FROM your_table_name
),
patients_per_day AS (
SELECT id
, possible_dates
FROM all_dates ad
LEFT JOIN your_table_name di
ON datediff(ad.possible_dates,di.entry_date)<= di.date_diference
)
SELECT possible_dates, COUNT(ID)
FROM patients_per_day
GROUP BY 1
答案 1 :(得分:0)
这将细分所有日期的条目数量。您可以修改SELECT
以添加特定的月份和/或年份。
SELECT
CONCAT(YEAR, '-', MONTH, '-', DAY) AS THE_DATE,
ENTRIES
FROM (
SELECT
DATE_FORMAT(entry_date, '%m') AS MONTH,
DATE_FORMAT(entry_date, '%d') AS DAY,
DATE_FORMAT(entry_date, '%Y') AS YEAR,
COUNT(*) AS ENTRIES
FROM
saps
GROUP BY
MONTH,
DAY,
YEAR
) AS ENTRIES
ORDER BY
THE_DATE DESC