【问题标题】:How to get count of average calls every 5 minutes using datetime sql如何使用 datetime sql 每 5 分钟获取一次平均调用次数
【发布时间】:2018-10-19 10:26:55
【问题描述】:

我正在运行以下查询

select DateTime
from Calls
where DateTime > '17 Oct 2018 00:00:00.000' and
      DialedNumberID = '1234'

这会给我一个列表,列出在特定日期拨打此号码的所有时间。

基本上我正在寻找的是一个查询,它可以为我提供每 X 分钟发生的平均呼叫次数,并希望全年运行该查询。

谢谢

【问题讨论】:

  • 结果会是什么样子?一个数字代表 X 分钟内的平均通话量?
  • 你卡在哪里了?您面临哪些问题需要我们解答?
  • 是单个数字,但查询无效
  • select count(*) / timestampdiff(minute, date '2018-01-01', now()) * 5 as avg_calls from calls where DateTime >= date '2018-01-01 ' 和 DialedNumberID = 1234;
  • 预期输出是什么?

标签: sql sql-server qsqlquery


【解决方案1】:

我猜你有一个名为Calls 的表,其中包含DateTimeDialedNumberID 列。

您可以使用模式类型逐年汇总该表中的信息。

  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,与保留字相同。

【讨论】:

    【解决方案2】:

    每个时间间隔的平均调用次数是调用次数 (COUNT(*)) 除以监控周期开始和结束之间的分钟数 (TIMESTAMPDIFF(minute, period_start, period_end)) 乘以所需时间间隔内的分钟数 (五个在你的例子中)。

    对于 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;
    

    【讨论】:

    • 当我在寻找 sql server 的答案时,道歉将其标记为 mysql ......所以这个查询似乎不起作用
    • 对于 SQL Server,该函数称为 DATEDIFFNOWGETDATE,不支持 ANSI 日期文字,名称用括号括起来,整数除法不包含小数。
    • 如何获得每 5 分钟间隔的最大呼叫数
    • 这有点难。例如,如果我查看 1:00-1:05, 1:05-1:10, ... 我最多可能会接到五个电话,但如果我查看 1:01-1:06, 1:06 -1:11, ...我可能突然接到最多十个电话或只有两个电话。那么你想如何定义五分钟的间隔呢?可能会查看每个记录/时间并计算在那之前的五分钟内发生的记录,并从所有这些计数中取最大值。
    • 确实,我只想查看 5 分钟间隔内的最大数字
    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 2015-09-08
    • 2021-06-16
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2017-09-11
    相关资源
    最近更新 更多