计算一个月中每一天的ID

时间:2019-08-13 18:05:52

标签: mysql

我在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'  

2 个答案:

答案 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