按小时计算患者人口普查

时间:2014-02-24 17:00:43

标签: sql-server-2008 tsql census

我正在尝试构建一个按小时计算急诊室患者人数的查询。我有每个病人的到达和离开时间。我尝试构建一个布尔样式查询,但它所做的只是使用这个逻辑

按小时给我
SELECT MRN,
   ,CASE WHEN CAST(EDArrival AS TIME) between  '00:00:00.000' and '00:59:59.000' then 1 else 0 end as Hour0
   ,CASE WHEN CAST(EDArrival AS TIME) between  '01:00:00.000' and '01:59:59.000' then 1 else 0 end as Hour1
   ,CASE WHEN CAST(EDArrival AS TIME) between  '02:00:00.000' and '02:59:59.000' then 1 else 0 end as Hour2
FROM EDArrivals

'2012-06-01'和'2013-07-01'之间的EDA到来

我在想,也许这个查询可能会在每个小时内放置一个列,其中1或0位于ED期间。我最终希望得到的是一年中ED的平均患者。如果有人能想到更简单的方法,我会非常感谢你的帮助。

谢谢

4 个答案:

答案 0 :(得分:1)

这可能不会很好,但会在您指定的时间跨度内给出每小时的平均值。由于CTE中JOIN条件中的函数,因此perf问题将出现。如果您需要为非常多的行执行此操作,则将其分解为另一个表并使用小时填充列可能是有意义的。

DECLARE @Hours TABLE (Hr smallint)

INSERT INTO @Hours
        (Hr)
VALUES
 (0)
,(1)
,(2)
,(3)
,(4)
,(5)
,(6)
,(7)
,(8)
,(9)
,(10)
,(11)
,(12)
,(13)
,(14)
,(15)
,(16)
,(17)
,(18)
,(19)
,(20)
,(21)
,(22)
,(23)

WITH ByDate
AS
(
SELECT 
    CAST(ED.EDArrival AS date) AS 'Dt',h.Hr, COUNT(*) AS 'PatientCount'
FROM
    EDArrivals ED
JOIN
    @Hours AS h
        ON DATEPART(HOUR, ED.EDArrival) = h.Hr
WHERE
    ED.EDArrival BETWEEN '2012-06-01' AND '2013-07-01'
GROUP BY
    CAST(ED.EDArrival AS date) 
    ,h.Hr
)
SELECT
    Hr, AVG(PatientCount)
FROM 
    ByDate
GROUP BY
    hr
ORDER BY
    hr

我还应该注意,虽然你没有在你的要求中列出它,但是也可能更有意义的是,在出发时间过滤是> =给定的小时。您可能不仅需要知道有多少患者出现,而且在任何特定时间都会有多少患者出现。

答案 1 :(得分:0)

您是否尝试过使用DateDiff:

SELECT DateDiff(n, startdate, enddate) FROM MyTable

答案 2 :(得分:0)

SELECT COUNT(*) [TotalArrivals]
     , DATEPART(hh, [EDArrival]) [Hour]
  FROM [EDArrivals]
 GROUP BY DATEPART(hh, [EDArrival])

这将为您提供按小时分组的总到达时间。然后,您可以使用它来计算每小时的平均值/您需要的任何其他计算。这不会给你没有到达的时间,但这应该很容易适应你的计算结束。

答案 3 :(得分:0)

我设法在SQLFiddle中创建了我的评论示例。

http://sqlfiddle.com/#!6/5234e/6

这与JNK答案类似(嘿,我先评论过!)

顺便说一下,创建该表变量不会很好,请考虑使用小时数来保存域表。

如果您需要性能,请考虑保留日期部分值。评估每一行是一个性能杀手。

同时注意零离开日期时间和午夜时分患者。