Mysql 计算一个月内每天的id

Mysql 计算一个月内每天的id,mysql,Mysql,我在mysql中为一家医院建立了一个数据库,其中的列是:id、entry\u date、exit\u date最后两列是医院患者的入口和出口。 我想数一数每个月每天的病人人数 计算给定一天的ID数的代码相对简单,如前所述,但我不知道如何计算整个月内每天的ID数 Day 2019-09-01: x patients Day 2019-09-02: y patients Day 2019-09-03: z patients . . . x + y + z + ... = total patients

我在mysql中为一家医院建立了一个数据库,其中的列是:id、entry\u date、exit\u date最后两列是医院患者的入口和出口。 我想数一数每个月每天的病人人数

计算给定一天的ID数的代码相对简单,如前所述,但我不知道如何计算整个月内每天的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
选择Countid作为patientsday 来自SAP 其中输入日期为“2019-05-02” 或退出日期为空 医院='X'
首先,假设每天至少有一名患者进入这家医院,我会写一个临时表,包含所有可能的日期,称为all_日期

第二,我将创建一个临时表,将您拥有的表与所有_日期连接起来。在这种情况下,我们的想法是复制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  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

这将对所有日期的条目数进行细分。您可以修改选择以添加特定的月份和/或年份

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

当患者处于活动状态时,退出日期将为空,我如何了解此想法?使用当前退出日期作为活动患者的退出日期