我正在运行以下查询
select DateTime
from Calls
where DateTime > '17 Oct 2018 00:00:00.000' and
DialedNumberID = '1234'
这将为我提供在特定日期拨打此号码的所有时间的列表。
基本上,我要查找的是一个查询,该查询可以让我每隔X分钟拨打一次平均电话,并且希望全年运行一次查询。
谢谢
答案 0 :(得分:0)
我猜您有一个名为Calls
的表,其中包含列DateTime
和DialedNumberID
。
您可以使用这种模式逐年汇总该表中的信息。
SELECT YEAR(`DateTime`),
DialedNumberID,
COUNT(*) call_count
FROM Calls
GROUP BY YEAR(`DateTime`), DialedNumberID
此模式的诀窍是GROUP BY f(date)
。函数f()
将任何日期缩短为发生的年份。
以五分钟为间隔的摘要,您需要f(date)
将日期戳减少到五分钟为间隔。该功能比YEAR()
要复杂得多。
DATE_FORMAT(datestamp,'%Y-%m-%d %H:00') + INTERVAL (MINUTE(datestamp) - MINUTE(datestamp) MOD 5)
以2001-09-11 08:43:00
为例,这将返回2001-09-11 08:40:00
。
所以,这是您每隔五分钟的摘要。
SELECT DATE_FORMAT(`DateTime`,'%Y-%m-%d %H:00')+INTERVAL(MINUTE(`DateTime`)-MINUTE(datestamp) MOD 5) interval_beginning,
DialedNumberID,
COUNT(*) call_count
FROM Calls
GROUP BY DATE_FORMAT(`DateTime`,'%Y-%m-%d %H:00')+INTERVAL(MINUTE(`DateTime`)-MINUTE(datestamp) MOD 5),
DialedNumberID
通过为丑陋的DATE_FORMAT()
表达式定义一个存储函数,可以使查询更清楚,更不重复。但这是另一天的话题。
最后,添加
WHERE YEAR(`DateTime`) = YEAR(NOW())
AND DialedNumberID = '1234'
查询以按当前年份和特定ID进行过滤。
此查询将需要进行工作以使其尽可能高效。这也是另一天的话题。
专业提示: DATETIME
是MySQL中的保留字。列名通常不区分大小写。避免为您的列命名,在这种情况下为DateTime
,与保留字相同。
答案 1 :(得分:0)
每个时间间隔的平均通话量是通话次数(COUNT(*)
)除以受监控时段(TIMESTAMPDIFF(minute, period_start, period_end)
)的开始到结束之间的分钟数再乘以分钟数所需的时间间隔(在您的示例中为5)。
对于MySQL:
select count(*) / timestampdiff(minute, date '2018-01-01', now()) * 5 as avg_calls
from calls
where `datetime` >= date '2018-01-01'
and dialednumberid = 1234;
对于SQL Server:
select count(*) * 1.0 / datediff(minute, '20180101', getdate()) * 5 as avg_calls
from calls
where [datetime] >= '20180101'
and dialednumberid = 1234;