2014-02-24 25 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 

我也應該注意到,雖然你不會在你的需求列表,它可能更有意義也出發時間過濾器> =給出小時。您可能需要知道的不僅是有多少患者出現,而且還有多少患者在任何特定時間出現。