mysql查询-峰值并发呼叫CDR数据

2023-12-07

您好,我需要帮助解决如何根据 MySQL 中存储的 CDR 日期计算一天内有多少个峰值并发呼叫。

数据集如下所示:

INSERT INTO `cdr` (`calldate`, `clid`, `src`, `dst`, `dcontext`, `channel`, `dstchannel`, 
                   `lastapp`, `lastdata`, `duration`, `billsec`, `disposition`, `amaflags`, 
                   `accountcode`, `uniqueid`, `userfield`) VALUES

我可以使用以下查询来计算每个唯一日期有多少条目。

SELECT COUNT(1) AS entries, date(calldate) AS DATE
FROM  `cdr` 
GROUP BY DATE (calldate)
LIMIT 0 , 1000

然而,这仅告诉我并发调用的理论峰值,而不是实际峰值。

为了获得实际的峰值,我们首先需要知道每次调用的开始和结束日期以及时间。 目前,开始日期和时间记录在 (calldate) 字段中,并且呼叫的持续时间以秒为单位记录在 (duration) 字段中。通过将 (duration) 字段中存储的秒数添加到 (calldate) 字段中,我们可以计算完成时间。

现在我们知道了开始和结束时间,我们需要计算这些时间是否重叠以及重叠了多少次。这种级别的 SQL 查询远远超出了我的知识范围。

回顾一下,我尝试使用 MySQL 查询计算来自 MySQL 中存储的 CDR 数据的并发呼叫峰值数量。非常感谢任何帮助

样本数据:

    calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,accountcode,uniqueid,userfield
08/11/2013 17:02,x,x,1000,default,x,x,x,x,26,26,ANSWERED,3,x,1383930162,x
08/11/2013 17:02,x,x,1000,default,x,x,x,x,24,24,ANSWERED,3,x,1383930164,x
08/11/2013 17:02,x,x,1000,default,x,x,x,x,45,45,ANSWERED,3,x,1383930146,x
08/11/2013 17:10,x,x,1000,default,x,x,x,x,2,2,ANSWERED,3,x,1383930649,x
08/11/2013 17:22,x,x,1000,default,x,x,x,x,4,4,ANSWERED,3,x,1383931380,x
08/11/2013 17:23,x,x,1000,default,x,x,x,x,5,5,ANSWERED,3,x,1383931388,x
08/11/2013 17:23,x,x,1000,default,x,x,x,x,9,9,ANSWERED,3,x,1383931395,x
10/11/2013 09:28,x,x,1000,default,x,x,x,x,7,7,ANSWERED,3,x,1384075689,x
10/11/2013 10:09,x,x,1000,default,x,x,x,x,57,57,ANSWERED,3,x,1384078181,x
10/11/2013 10:09,x,x,1000,default,x,x,x,x,81,81,ANSWERED,3,x,1384078164,x
10/11/2013 10:09,x,x,1000,default,x,x,x,x,102,102,ANSWERED,3,x,1384078143,x
11/11/2013 10:23,x,x,1000,default,x,x,x,x,3,3,ANSWERED,3,x,1384165439,x
11/11/2013 17:46,x,x,1000,default,x,x,x,x,30,30,ANSWERED,3,x,1384191975,x
11/11/2013 17:46,x,x,1000,default,x,x,x,x,30,30,ANSWERED,3,x,1384191976,x
11/11/2013 17:45,x,x,1000,default,x,x,x,x,50,50,ANSWERED,3,x,1384191956,x
11/11/2013 17:55,x,x,1000,default,x,x,x,x,9,9,ANSWERED,3,x,1384192544,x
13/11/2013 10:59,x,x,1000,default,x,x,x,x,209,209,ANSWERED,3,x,1384340382,x
13/11/2013 10:59,x,x,1000,default,x,x,x,x,230,230,ANSWERED,3,x,1384340361,x
13/11/2013 11:09,x,x,1000,default,x,x,x,x,1342,1342,ANSWERED,3,x,1384340963,x
13/11/2013 11:10,x,x,1000,default,x,x,x,x,1312,1312,ANSWERED,3,x,1384341009,x
13/11/2013 11:08,x,x,1000,default,x,x,x,x,1441,1441,ANSWERED,3,x,1384340891,x
13/11/2013 11:10,x,x,1000,default,x,x,x,x,1288,1288,ANSWERED,3,x,1384341059,x
13/11/2013 11:10,x,x,1000,default,x,x,x,x,1306,1306,ANSWERED,3,x,1384341050,x
13/11/2013 11:09,x,x,1000,default,x,x,x,x,1378,1378,ANSWERED,3,x,1384340990,x
13/11/2013 11:09,x,x,1000,default,x,x,x,x,1419,1419,ANSWERED,3,x,1384340953,x
13/11/2013 11:06,x,x,1000,default,x,x,x,x,1558,1558,ANSWERED,3,x,1384340815,x
13/11/2013 11:12,x,x,1000,default,x,x,x,x,1254,1254,ANSWERED,3,x,1384341121,x
13/11/2013 11:10,x,x,1000,default,x,x,x,x,1330,1330,ANSWERED,3,x,1384341045,x
13/11/2013 11:09,x,x,1000,default,x,x,x,x,1431,1431,ANSWERED,3,x,1384340947,x
13/11/2013 11:11,x,x,1000,default,x,x,x,x,1302,1302,ANSWERED,3,x,1384341076,x
13/11/2013 11:09,x,x,1000,default,x,x,x,x,1383,1383,ANSWERED,3,x,1384340995,x
13/11/2013 11:08,x,x,1000,default,x,x,x,x,1444,1444,ANSWERED,3,x,1384340937,x
13/11/2013 11:07,x,x,1000,default,x,x,x,x,1531,1531,ANSWERED,3,x,1384340850,x
13/11/2013 11:09,x,x,1000,default,x,x,x,x,1418,1418,ANSWERED,3,x,1384340963,x
13/11/2013 12:02,x,x,1000,default,x,x,x,x,10,10,ANSWERED,3,x,1384344169,x
13/11/2013 12:01,x,x,1000,default,x,x,x,x,807,807,ANSWERED,3,x,1384344072,x
13/11/2013 12:03,x,x,1000,default,x,x,x,x,680,680,ANSWERED,3,x,1384344200,x
13/11/2013 12:01,x,x,1000,default,x,x,x,x,793,793,ANSWERED,3,x,1384344090,x
13/11/2013 12:01,x,x,1000,default,x,x,x,x,772,772,ANSWERED,3,x,1384344111,x

这个应该可以工作,但它是真正的性能杀手!

SELECT
  calldate,
  MAX(concurrent)+1 AS peakcount
FROM (
    SELECT
      DATE(a.calldate) as calldate,
      COUNT(b.uniqueid) AS concurrent
    FROM cdr AS a, cdr AS b
    WHERE  
      a.calldate BETWEEN '2013-11-08 00:00:00' AND '2013-11-13 23:59:59'
      AND (
        (a.calldate<=b.calldate AND (UNIX_TIMESTAMP(a.calldate)+a.duration)>=UNIX_TIMESTAMP(b.calldate))
        OR (b.calldate<=a.calldate AND (UNIX_TIMESTAMP(b.calldate)+b.duration)>=UNIX_TIMESTAMP(a.calldate))
      )
      AND a.uniqueid>b.uniqueid
    GROUP BY a.uniqueid
  ) AS baseview
GROUP BY calldate

给出示例数据的正确答案。下面是它的工作原理:

  • 最里面的部分(a.calldate<=b.calldate AND (UNIX_TIMESTAMP(a.calldate)+a.duration)>=UNIX_TIMESTAMP(b.calldate)...) 计算交集:如果一个调用的起始点位于另一个调用的起始点或之后并且位于该调用的结束点或之前,则两个调用重叠
  • 自连接调用表会发现所有重叠,
  • 但有一个问题:自连接在第 1 行和第 2 行之间发现了重叠,但在第 2 行和第 1 行之间发现了另一个重叠。如果两个以上的调用重叠,则解决此问题会很乏味
  • 现在,由于您的数据包含一个数字唯一 ID,我们可以使用它来过滤那些重复、三重等。这是由AND a.uniqueid>b.uniqueid选择器和GROUP BY a.uniqueid,这使得只有具有最小 uniqueid 的调用才能看到所有并发调用,其他调用看到的较少
  • Using MAX()在外部查询中过滤掉这条记录
  • 我们需要+1获取峰值呼叫数:具有 2 个并发呼叫的呼叫意味着峰值数为 3

SQL小提琴

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql查询-峰值并发呼叫CDR数据 的相关文章

随机推荐

  • href="tel:" 和手机号码

    如果我使用tel 我应该写国际电话代码 就像这样 a href 61709 a 到目前为止 一切都很好 但我找不到有关如何以 国际 方式书写手机号码的信息 如果有的话 拨打您所在国家 地区的号码时 您仍然需要拨打国内长途电话号码在其余数字之
  • 使用 Xampp 运行 Python 脚本

    我正在使用 python 2 7 13首先 浏览器显示原始代码 我做了什么 编辑httpd conf AddHandler cgi script cgi pl asp py 在我所有脚本的顶部我添加了以下内容 j Installeds Py
  • C# 和 LINQ:按嵌套查询的值对查询进行排序

    我正在 ASP NET 中编写一个简单的论坛 该论坛位于 C 的实体框架数据库之上 Each Topic对象具有导航属性Posts指向一个集合Post对象 每个Post对象有一个属性When这表明该帖子的发布时间 Post Parent是类
  • 如何防止winforms设计器将Text属性设置为实例名称

    在开始之前 似乎以前可能有人问过类似 相同的问题here 然而没有明确的答案 假设我有一个自定义 winforms 控件 它覆盖Text财产 public class MyControl Control DefaultValue publi
  • 使用 ASP.NET 表单身份验证的 WCF 服务

    我正在通过 jQuery ajax 从 ASP NET 页面调用 WCF Web 服务 NET 4 0 如何保护 WCF 服务的安全 以便只有经过身份验证的 ASP NET 用户才能调用该服务的方法 我是否需要在每个服务方法中强制手动检查表
  • Google AppEngine ImportError:动态模块未定义 init 函数 (init_mysql)

    当我在 Google AppEngine 上使用 Flask 部署 python 应用程序时 出现此错误 如果有人帮助我 我将不胜感激 ps 我的本地服务器工作得很好 File base data home apps s dwnup 997
  • 如何在 php 中获取会话 ID 或用户名?

    我有一个用户可以登录的网站 我尝试过
  • 带扩展名的 TypeScript 导入

    您可能听说过 Deno 它是一个新的 TypeScript 运行时 Deno 和普通 TypeScript 之间的一个主要区别是您必须在 import 语句中包含文件扩展名 例如 import foo from bar ts 我想编写与 D
  • css resize 属性 - 更改调整大小图标属性

    我有一个带有 调整大小 属性的 div 默认情况下 您只能通过拖动窗口的右下角来更改大小 我想知道是否有可能改变它的行为 例如它的外貌 size or position 具体来说 我想做的是允许用户在边缘 而不是角落 重新调整窗口的大小 类
  • mongo $slice查询反向索引超出范围

    mongo 中的以下查询表现得很奇怪 db items findOne List slice skip 3 第一的 它不是仅返回一个带有 id List 键的对象 而是返回一个完整的对象 第二 如果skip是负数并且 skip 高于 lis
  • Numpy 创建一个空的 alpha 图像

    我想创建一个空白的 alpha 图像来解析 py opencv 中的一些数据并将其保存在透明背景 png 文件中 我试过 blank image np zeros H W 4 np uint8 and blank image np full
  • 在异步方法中绑定到输出 Blob 时,将 Blob 绑定到 IAsyncCollector 时出错

    我正在尝试在这篇文章之后的异步方法中绑定到 blob 输出 如何将输出值绑定到我的异步 Azure Functions 我有多个输出绑定 因此仅返回不是一个选择 public static async Task
  • 在脚本中设置数字变量(“set $i 1”)不起作用(“echo $i”为空)

    正如标题所说 我需要一个 bash 脚本的帮助 该脚本必须在给定两个数字变量的情况下生成一个字符串 该字符串将用于生成文件名 但是当我测试名称生成代码时 它不会产生任何结果 脚本是下面的代码 usr bin set nombre decla
  • 以编程方式将数据源绑定到报表服务器中的 rdl - SSRS

    我已经完成了一个 ASP NET 应用程序来生成特定数据的报告 最初 我创建了本地报告 rdlc 来生成报告 我为每个 rdlc 创建了单独的 xsd 并设计了报告 我以编程方式构建数据集并将其绑定到 rdlc 我使用以下代码将数据源绑定到
  • 关联引用是如何实现的?

    我在这里看到了一个非常好的示例 子类 UIButton 添加属性 它是什么 您无法将对象添加到类别 但现在有了这个技巧你就可以了 那么它是什么 它是如何工作的 Objective c 对象已经有一些恒定数量的 ivar 指针 对吗 现在你再
  • 根元素带有 ngRepeat 的指令并替换:true

    有人可以解释以下行为背后的根本原因吗 如果指令具有隔离范围scope 有一个根元素ng repeat AND replace true然后它 破坏 隔离范围 这意味着隔离范围在指令内不可访问 可见 并且指令开始从外部范围接收变量 这是我可以
  • 导入 Geopandas 时遇到的问题

    我正在尝试将 geopandas 从 Anaconda 导入到我的 Jupyter Notebook 中 安装似乎有效 但是当我尝试导入包时出现以下错误 ImportError Traceback most recent call last
  • 如何将 Jersey 与较新版本的 jackson 一起使用

    我正在使用 Jersey 2 23 1 jersey media json jackson 但这与 Jackson 2 5 4 相关 但我需要使用 Jackson 2 6 0 或更新版本 我怎样才能做到这一点 我尝试在我的 pom xml
  • 如何在 jQuery cookie 中存储数组?

    我正在基于此打开一个新线程如何在jquery cookie中存储数组 我正在使用 almog ori 的函数 var cookieList function cookieName When the cookie is saved the i
  • mysql查询-峰值并发呼叫CDR数据

    您好 我需要帮助解决如何根据 MySQL 中存储的 CDR 日期计算一天内有多少个峰值并发呼叫 数据集如下所示 INSERT INTO cdr calldate clid src dst dcontext channel dstchanne