2014-02-24 27 views
1

我正在尝试构建一个查询,以小时计算急诊室中的患者人数。我有每个患者的到达和离开时间。我试图建立一个布尔风格的查询,但它所作的只是使用这个逻辑按小时计算患者人口普查

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 

WHERE EDArrival“2012-06-01”之间“2013-07-01”

给我按小时抵港我在想也许查询可能会在每个小时内为他们在1小时内放置一个1或0的列。我最终希望得到的是在一年中每小时的平均患病率。如果有人能想到更简单的方法,我将非常感谢帮助。

谢谢

+0

'select count(*)from ... where ... between ... between group by hour(edarrival)',基本上,使用sqlserver特定的时间内容。 –

+0

由于您正在出发时间,并且您希望患者仍处于紧急状态,为何不选择出发时间为空的患者? – jean

+0

@jean我不能使用这种逻辑,因为它只会给我那些目前仍在ED中的患者。我需要建立这样一个回顾性工具,可用于确定ED何时最满。 – AndrewMo

回答

0

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

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

它类似于JNK的答案(嘿嘿,我评论第一!)

顺便说一句,创建表变量不会很大,可以考虑保持域表的时间。

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

还要留意空位离开日期时间和患者在午夜时分。

+0

这工作得很好,非常感谢! – AndrewMo

0

您是否尝试过用则DateDiff:

SELECT DateDiff(n, startdate, enddate) FROM MyTable 
+0

谢谢,但这给了我在ED患者的住院时间,我怎么能用这个来确定他们实际在ED的时间,而不必手动计算每个小时? – AndrewMo

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

这将让你按小时分组的占旅客。然后,您可以使用它来计算每小时的平均值/无论您需要其他计算。这不会给你没有到达的时间,但最后应该很容易适应你的计算。

1

这可能不会很好,但它会给出您指定时间范围内每小时的平均值。性能问题将由于CTE中的JOIN标准中的功能。如果您需要为大量行执行此操作,则可以将其分解到另一个表并使用小时填充列。

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 

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