我在MariaDB版本5. 5. 65上有这个
datetimeconnect datetimeend queue agent event
02/05/2022 10:02:31 02/05/2022 10:02:31 "5009" "Mikey Blogs" "ADDMEMBER"
02/05/2022 15:53:58 02/05/2022 15:53:58 "5009" "Mikey Blogs" "REMOVEMEMBER"
02/05/2022 16:42:28 02/05/2022 16:42:28 "5005" "Mikey Blogs" "ADDMEMBER"
02/05/2022 18:02:45 02/05/2022 18:02:45 "5005" "Mikey Blogs" "REMOVEMEMBER"
03/05/2022 10:01:33 03/05/2022 10:01:33 "5009" "Mikey Blogs" "ADDMEMBER"
03/05/2022 16:01:22 03/05/2022 16:01:22 "5009" "Mikey Blogs" "REMOVEMEMBER"
第一行"ADDMEMBER“是开始,第二行”REMOVEMEMBER“是结束..因此,我需要在每一行上显示:开始(row1)结束(row2)、队列、名称和datediff(end,start)来显示持续时间。
我管理我从来没有合并行之前。。如果任何人可以协助,我非常感谢。祝你有美好的一天
添加:我希望看到的Tge输出是(一个单行):开始日期(行1)ADDMEMBER、结束日期(行2)REMOVEMEMBER、hh:mm:ss中的差异、名称、队列号。以及显示创建表结果:
CREATE TABLE `queue_stats_mv` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`datetime` timestamp NOT NULL DEFAULT '1971-01-01 00:00:00',
`datetimeconnect` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`datetimeend` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`queue` varchar(100) NOT NULL DEFAULT '',
`agent` varchar(100) NOT NULL DEFAULT '',
`event` varchar(40) NOT NULL DEFAULT '',
`uniqueid` varchar(50) NOT NULL DEFAULT '',
`real_uniqueid` varchar(50) NOT NULL,
`clid` varchar(50) NOT NULL DEFAULT '',
`url` varchar(100) NOT NULL DEFAULT '',
`did` varchar(100) NOT NULL DEFAULT '',
`position` int(6) unsigned NOT NULL DEFAULT '1',
`info1` varchar(50) NOT NULL DEFAULT '',
`info2` varchar(50) NOT NULL DEFAULT '',
`info3` varchar(50) NOT NULL DEFAULT '',
`info4` varchar(50) NOT NULL DEFAULT '',
`info5` varchar(50) NOT NULL DEFAULT '',
`overflow` int(6) unsigned NOT NULL DEFAULT '1',
`combined_waittime` int(11) unsigned NOT NULL DEFAULT '0',
`waittime` int(11) unsigned NOT NULL DEFAULT '0',
`talktime` int(11) unsigned NOT NULL DEFAULT '0',
`ringtime` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `fecha` (`datetime`),
KEY `ev` (`event`),
KEY `pidx` (`real_uniqueid`,`id`),
KEY `uni` (`uniqueid`),
KEY `runi` (`real_uniqueid`)
) ENGINE=InnoDB AUTO_INCREMENT=1209991 DEFAULT CHARSET=utf8
1条答案
按热度按时间cdmah0mi1#
在较新版本的mariadb(10.2或更高版本)中,您可以在子查询中使用lag或lead窗口函数,这可能会更有效一些。在您的旧版本中,最简单的方法是执行self join来查找以下事件(连接 all following events,但使用where条件来确保removemember被找到,并且它实际上是紧接着的事件):
您将需要
(queue,agent,event,datetimeconnect)
上的复合索引(或者只要时间是最后一个,顺序的一些变化),尽管只有在除了addmember和removemember之外还有很多其他事件的情况下才需要包括event。如果期望有某个最大持续时间,则可以通过将其添加到join on子句来改进查询,例如:
我假设您从来没有同一个队列/代理的多个事件具有相同的日期时间连接;这是可以实现,但需要您显示您的架构。
一个更有效的方法是使用变量模拟滞后窗口函数,但只有在简单的方法效率不够高时才值得这样做。
由于您使用的是非UTC时间,因此datediff无法在所有情况下正确计算持续时间,但最好在单独的问题中解决这个问题。