mariadb 合并2行的结果,开始于行1,结束于行2

nnsrf1az  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(159)

我在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
cdmah0mi

cdmah0mi1#

在较新版本的mariadb(10.2或更高版本)中,您可以在子查询中使用lag或lead窗口函数,这可能会更有效一些。在您的旧版本中,最简单的方法是执行self join来查找以下事件(连接 all following events,但使用where条件来确保removemember被找到,并且它实际上是紧接着的事件):

select addmember.queue, addmember.agent, addmember.datetimeconnect, removemember.datetimeconnect
from queue_stats_mv addmember
join queue_stats_mv removemember on
    removemember.queue=addmember.queue and
    removemember.agent=addmember.agent and
    removemember.event in ('ADDMEMBER','REMOVEMEMBER') and
    removemember.datetimeconnect > addmember.datetimeconnect
where
    addmember.event='ADDMEMBER' and
    removemember.event='REMOVEMEMBER' and
    not exists (
        select 1
        from queue_stats_mv inbetween
        where
            inbetween.queue=addmember.queue and
            inbetween.agent=addmember.agent and
            inbetween.event in ('ADDMEMBER','REMOVEMEMBER') and
            inbetween.datetimeconnect between addmember.datetimeconnect and removemember.datetimeconnect
    )

您将需要(queue,agent,event,datetimeconnect)上的复合索引(或者只要时间是最后一个,顺序的一些变化),尽管只有在除了addmember和removemember之外还有很多其他事件的情况下才需要包括event。
如果期望有某个最大持续时间,则可以通过将其添加到join on子句来改进查询,例如:

and removemember.datetimeconnect <= addmember.datetimeconnect + interval 1 day

我假设您从来没有同一个队列/代理的多个事件具有相同的日期时间连接;这是可以实现,但需要您显示您的架构。
一个更有效的方法是使用变量模拟滞后窗口函数,但只有在简单的方法效率不够高时才值得这样做。
由于您使用的是非UTC时间,因此datediff无法在所有情况下正确计算持续时间,但最好在单独的问题中解决这个问题。

相关问题