患者日计算

时间:2016-12-14 14:40:26

标签: sql sql-server

我目前正在尝试编写一个查询来计算患者天数。我的源表有VisitID,AdmitDateTime和DischargeDateTime。患者日定义为患者在午夜躺在床上。因此,例如,如果在2016-01-01期间有5名患者入院,而且之前没有其他患者住院,那么2016-01-02患者日数将等于5。

我想显示结果,列是日期和计数。我想过用CTE构建一个日历表,但我不确定连接应该对我的源表有什么影响。如果在某一天床上没有患者,我希望计数为0.我对SQL是相当新的,所有的帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我强烈建议您使用日历表,但如果这不适合您,则可以使用递归CTE构建主日期列表。

请注意,如果您的整体日期范围超过100天,由于cte递归的限制,这不会起作用。 (再次。尝试使用日历表会更有效率。)

如果您需要报告特定月份,那么您需要更改定义[FirstDate]和[LastDate]

的初始cte
DROP TABLE #Clientvisit

CREATE TABLE #ClientVisit(
VisitID INT
,AdmitDateTime DATETIME
,DischargeDateTime DATETIME
)

INSERT INTO #ClientVisit
VALUES
(1,'20160604 13:50','20160606 03:50')
,(2,'20160604 13:50','20160609 13:50')


--IF YOU'RE NOT USING A CALENDAR TABLE THEN USE RECURSIVE CTE TO BUILD DATE LIST
;WITH cte
    AS
    (
    SELECT
        MIN(CAST(AdmitDateTime AS DATE)) AS FirstDate
        ,MAX(CAST(DischargeDateTime AS DATE)) AS LastDate
    FROM
        #ClientVisit
    )
,cte_R
    AS
    (
    SELECT FirstDate,LastDate FROM cte
    UNION ALL
    SELECT DATEADD(DD,1,FirstDate),LastDate FROM cte_R
    WHERE DATEADD(DD,1,FirstDate) <= LastDate
    )
SELECT
    c.FirstDate
    ,COUNT(v.VisitID) AS BedDays
FROM
    cte_R c
        LEFT JOIN #ClientVisit v
            ON
            DATEADD(DD
                    ,1  --PLAY WITH THIS VALUE EITHER -1/0/1 TO ALLIGN THE BEDDAYS WITH THE DESIRED DATE
                    ,c.FirstDate) BETWEEN v.AdmitDateTime AND v.DischargeDateTime
GROUP BY
    c.FirstDate