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 EDA在“2012-06-01”和“2013-07-01”之间到达

我在想也许查询可以为每个小时放置一个列,其中包含 1 或 0,在这些时间里他们在 ED 中。我最终想要的是一年中按小时计算的急诊室患者。如果有人能想到更简单的方法,我将不胜感激。

谢谢

4

4 回答 4

1

这可能不会很好,但它会在您指定的时间跨度内给出每小时的平均值。性能问题将是因为JOINCTE 标准中的功能。如果您需要对大量行执行此操作,则将其拆分到另一个表并用小时填充一列可能是有意义的。

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

我还应该注意,虽然您没有在您的要求中列出它,但在出发时间 >= 给定小时数上进行过滤可能更有意义。您可能不仅需要知道有多少患者出现,还需要知道在任何特定时间有多少患者在附近。

于 2014-02-24T17:44:56.613 回答
0

您是否尝试过使用 DateDiff:

SELECT DateDiff(n, startdate, enddate) FROM MyTable
于 2014-02-24T17:09:01.410 回答
0
SELECT COUNT(*) [TotalArrivals]
     , DATEPART(hh, [EDArrival]) [Hour]
  FROM [EDArrivals]
 GROUP BY DATEPART(hh, [EDArrival])

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

于 2014-02-24T17:35:04.767 回答
0

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

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

它类似于 JNK 答案(嘿,我先评论了!)

顺便说一句,创建该表变量并不是很好,请考虑保留一个包含小时数的域表。

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

还要注意空出发日期时间和午夜逗留的患者。

于 2014-02-24T17:59:47.287 回答