행 1에서 시작하고 행 2에서 끝을 갖는 행 2개의 결과를 결합합니다.
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"
첫 번째 행 'ADD MEMBER'는 시작이고 두 번째 행 'REMOVE MEMBER'는 끝입니다.각 행에 시작(1행) 끝(2행), 큐, 이름 및 datediff(끝, 시작)를 표시하여 기간을 표시해야 합니다.
이전에는 행을 결합할 필요가 없었습니다.누가 도와준다면 정말 감사하겠습니다.좋은 하루 되세요.
추가:제가 보고 싶은 Tge 출력은 (하나의 행) 시작일 (1행) ADDMEMBER, 종료일 (2행) REMOVEMEMBER, hh:mm:ss, name, queue number 입니다.테이블 생성 결과를 보여줍니다.
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
새로운 버전의 mariadb(10.2 이상)에서는 이를 위해 하위 쿼리에서 lag 또는 lead window 함수를 사용할 것이며, 이는 상당히 더 효율적일 것입니다.가장 쉬운 방법은 이전 버전에서 자체 가입을 통해 다음 이벤트를 찾는 것입니다(다음 이벤트에 모두 가입하지만 멤버 제거를 보장하는 조건이 발견되고 실제로는 바로 다음 이벤트임).
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 이외의 이벤트가 많을 경우에만 포함하면 됩니다.
최대 지속 시간이 예상되는 경우 다음과 같이 join on 절에 추가하여 쿼리를 개선할 수 있습니다.
and removemember.datetimeconnect <= addmember.datetimeconnect + interval 1 day
동일한 날짜 시간 연결을 가진 동일한 큐/에이전트에 대해 여러 이벤트가 발생하지 않는다고 가정합니다. 이는 작업이 가능하지만 스키마를 표시해야 합니다.
더 효율적인 방법은 변수를 사용하여 lag window 함수를 에뮬레이트하는 것이지만, 이는 쉬운 방법이 충분히 효율적이지 않은 경우에만 가능합니다.
UTC가 아닌 시간이 있기 때문에 datediff는 모든 경우에 기간을 정확하게 계산하지는 않지만, 그것은 별도의 질문에서 다루는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/72145159/combine-results-of-2-rows-with-start-on-row1-and-end-on-row2
'source' 카테고리의 다른 글
도커, 볼륨을 읽기 전용으로 마운트 (0) | 2023.09.19 |
---|---|
도커 이미지 설치 디렉토리를 변경하는 방법은? (0) | 2023.09.19 |
오라클에서 인덱스를 사용하지 않도록 강제하는 방법 (0) | 2023.09.19 |
C 구조의 문자열 필드로 작업하는 방법? (0) | 2023.09.19 |
window에서 digital ocean의 mysql 데이터베이스에 연결하는 방법 (0) | 2023.09.19 |