【问题标题】:Count id for each day in a month计算一个月中每一天的id
【发布时间】:2019-08-13 18:05:52
【问题描述】:

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

【问题讨论】:

    标签: mysql


    【解决方案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
    

    【讨论】:

    • 当患者处于活动状态时,exit_date 将为 NULL,我该如何理解这个想法?
    • 使用 current_date() 作为活动患者的 exit_date
    【解决方案2】:

    这将分解所有日期的条目数。您可以修改 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
    

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 2012-03-12
      • 2021-09-22
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多