我正在尝试构建一个按小时计算急诊室患者人数的查询。我有每个病人的到达和离开时间。我尝试构建一个布尔样式查询,但它所做的只是使用这个逻辑
按小时给我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的平均患者。如果有人能想到更简单的方法,我会非常感谢你的帮助。
谢谢
答案 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答案类似(嘿,我先评论过!)
顺便说一下,创建该表变量不会很好,请考虑使用小时数来保存域表。
如果您需要性能,请考虑保留日期部分值。评估每一行是一个性能杀手。
同时注意零离开日期时间和午夜时分患者。