【发布时间】:2016-01-03 17:39:28
【问题描述】:
我正在 SQL Server 2005 中进行查询,该查询查看记录的电话呼叫表,按一天中的时间对它们进行分组,并计算一天中每个小时的平均等待时间。
我有一个我认为可行的查询,但我无法说服自己它是正确的。
SELECT
DATEPART(HOUR, CallTime) AS Hour,
(AVG(calls.WaitDuration) / 60) AS WaitingTimesInMinutes
FROM (
SELECT
CallTime,
WaitDuration
FROM Calls
WHERE DATEADD(day, DATEDIFF(Day, 0, CallTime), 0) = DATEADD(day, DATEDIFF(Day, 0, GETDATE()), 0)
AND DATEPART(HOUR, CallTime) BETWEEN 6 AND 18
) AS calls
GROUP BY DATEPART(HOUR, CallTime)
ORDER BY DATEPART(HOUR, CallTime);
为了澄清我认为正在发生的事情,此查询会查看与今天在同一天拨打的所有电话,以及通话时间在 6 到 18 点之间的时间 - 时间是按 24 小时时间记录和选择的,所以这几个小时之间是在早上 6 点到下午 6 点之间接听电话。
然后,外部查询计算 WaitDuration 列的平均值(并将秒转换为分钟),然后按小时对每个平均值进行分组。
我不确定的是:按小时报告的平均值是否仅针对在该小时的时间范围内拨打的电话?或者它是否使用当天和几个小时之间的所有呼叫来计算每个报告的平均值?我知道 AVG 函数有一个可选的 OVER/PARTITION 子句,而且我已经有一段时间没有使用 AVG 组函数了。我想要的是按小时分组的每个结果仅显示一天中特定小时的平均等待时间。
感谢您抽出宝贵时间。
【问题讨论】:
-
您对工作时间的限制实际上是允许在下午 6:59:59 之前拨打电话。您可能应该直接说
CallTime BETWEEN <start> and <end>或至少在 17 小时停止。 -
哦,很好,@Shawn!谢谢。
-
CallTime >= dateadd(hour, 6, cast(current_timestamp as date))) and CallTime < dateadd(hour, 18, cast(current_timestamp as date))) -
我将采用第一个想法,因为 SQL Server 2005 没有 DATE 类型。 :)
-
我不记得他们是在 2005 年还是 2008 年添加的。您可以随时使用
{fn current_date()}
标签: sql sql-server-2005 group-by average