Snowflake Sql 查询以查找特定任务流程之间完成一次相遇的编码任务所花费的时间
Snowflake Sql Query to find the time taken between specific task flow for completing the coding task for an encounter
希望你一切顺利!..遭遇是ctextid和vbillid的组合..在遭遇编码完成之前有多个事件发生..有时任务不会完成编码完全完成...以下表示任务流(事件类型),事件时间差应以分钟为单位计算...请在下面找到输入和输出tables ...你能请在这里帮助我.. Distinctnumberofcoders 计算为 user_id)..
的不同计数
170109-image.png
输入table
create table ##input
(event_time datetime2,
event_type varchar(1000),
user_id varchar(100),
ctextid int,
vbillid int)
insert into ##input values
('1/11/2022 1:21:02 PM','Start Work Clicked','am21','10021','21'),
('1/11/2022 1:46:02 PM','Coding Complete Clicked','am21','10021','21'),
('1/12/2022 1:46:02 PM','Start Work Clicked','am31','78321','561'),
('1/12/2022 1:51:02 PM','Home Button Clicked','am31','78321','561'),
('1/12/2022 2:04:02 PM','VisitBill Button Clicked','am12','78321','561'),
('1/12/2022 2:24:02 PM','Coding Complete Clicked','am12','78321','561'),
('1/12/2022 1:55:02 PM','Start Work Clicked','am78','5561','78'),
('1/12/2022 2:10:02 PM',' Icon Clicked','am78','5561','78'),
('1/12/2022 2:15:02 PM','VisitBill Button Clicked','am89','5561','78'),
('1/12/2022 2:44:02 PM','Coding Complete Clicked','am89','5561','78'),
('1/22/2022 9:55:02 AM','Start Work Clicked','am115','789','89'),
('1/22/2022 10:25:02 AM','Home Button Clicked','am115','789','89'),
('1/22/2022 10:45:02 AM','VisitBill Button Clicked','am115','789','89'),
('1/22/2022 11:10:02 AM',' Icon Clicked','am115','789','89'),
('1/22/2022 11:25:02 AM','VisitBill Button Clicked','am115','789','89'),
('1/22/2022 11:40:02 AM','Coding Complete Clicked','am115','789','89'),
('1/23/2022 9:55:02 AM','Start Work Clicked','am115','9918','890'),
('1/23/2022 10:25:02 AM','Home Button Clicked','am115','9918','890'),
('1/23/2022 10:45:02 AM','VisitBill Button Clicked','am115','9918','890'),
('1/23/2022 11:10:02 AM',' Icon Clicked','am115','9918','890'),
('1/23/2022 11:25:02 AM','VisitBill Button Clicked','am115','9918','890'),
('1/23/2022 11:30:02 AM','VisitBill Button Clicked','am115','9918','890'),
('1/23/2022 11:40:02 AM','Coding Complete Clicked','am115','9918','890'),
('1/25/2022 10:55:02 AM','Start Work Clicked','am115','10021','981'),
('1/25/2022 11:15:02 AM','Home Button Clicked','am115','10021','981'),
('1/25/2022 11:23:02 AM','VisitBill Button Clicked','am115','10021','981'),
('1/25/2022 9:45:02 AM','Start Work Clicked','am118','9021','904'),
('1/25/2022 10:05:02 AM','Home Button Clicked','am118','9021','904'),
('1/25/2022 10:23:02 AM','VisitBill Button Clicked','am120','9021','904'),
('1/25/2022 10:43:02 AM','Icon Clicked','am120','9021','904')
Output table
create table ##output
(ctextid int,
vbillid int,
eventdate date,
comment varchar(1000),
timetakeninminutes float,
distinctnumberofcoders int)
insert into ##output values
('10021','21','44572.5562731481','coding completed','25','1'),
('78321','561','44573.5771064815','coding completed','25','2'),
('5561','78','44573.5937731481','coding completed','44','2'),
('789','89','44583.4479398148','coding completed','70','1'),
('9918','890','44584.4479398148','coding completed','65','1'),
('10021','981','44586.4687731481','coding incomplete','20','1'),
('9021','904','44586.4465509259','coding incomplete','40','2')
首先,您需要构建一个地图,在这些事件之间计算时间。
然后你按 event_time 的顺序排列数据,然后你只计算所有这些出现的次数。
请试试这个代码:
WITH map AS (
SELECT *
FROM VALUES('Start Work Clicked', 'Coding Complete Clicked')
,('Start Work Clicked', 'Home Button Clicked')
,('Start Work Clicked', 'Icon Clicked')
,('VisitBill Button Clicked', 'Coding Complete Clicked')
,('VisitBill Button Clicked', 'Home Button Clicked')
,('VisitBill Button Clicked', 'Icon Clicked') AS t(first_event_type, second_event_type)
), ip AS (
SELECT *, CAST(event_time AS DATE) AS eventdate, ROW_NUMBER() OVER(PARTITION BY ctextid, vbillid, eventdate, user_id ORDER BY event_time) AS rn
FROM input
), gaps AS (
SELECT fi.ctextid
, fi.vbillid
, fi.user_id
, fi.event_time
, fi.eventdate
, m.second_event_type AS comment
, SUM(TIMEDIFF(minute, fi.event_time, si.event_time)) AS timetakeninminutes
FROM map AS m
JOIN ip AS fi ON TRIM(fi.event_type) = TRIM(m.first_event_type)
JOIN ip AS si ON TRIM(si.event_type) = TRIM(m.second_event_type)
AND fi.ctextid = si.ctextid
AND fi.vbillid = si.vbillid
AND fi.user_id = si.user_id
AND CAST(fi.event_time AS DATE) = CAST(si.event_time AS DATE)
AND fi.rn + 1 = si.rn
GROUP BY fi.ctextid, fi.vbillid, fi.user_id, fi.eventdate, comment, fi.event_time
)
SELECT DISTINCT
ctextid
, vbillid
, eventdate
, LAST_VALUE(comment) OVER(PARTITION BY ctextid, vbillid, eventdate ORDER BY event_time) AS comment
, SUM(timetakeninminutes) OVER(PARTITION BY ctextid, vbillid, eventdate) AS timetakeninminutes
, COUNT(DISTINCT user_id) OVER(PARTITION BY ctextid, vbillid, eventdate) AS distinctnumberofcoders
FROM gaps
ORDER BY eventdate, ctextid DESC, vbillid;
查询结果:
CTEXTID
VBILLID
EVENTDATE
COMMENT
TIMETAKENINMINUTES
DISTINCTNUMBEROFCODERS
10021
21
2022-01-11
Coding Complete Clicked
25
1
78321
561
2022-01-12
Coding Complete Clicked
25
2
5561
78
2022-01-12
Coding Complete Clicked
44
2
789
89
2022-01-22
Coding Complete Clicked
70
1
9918
890
2022-01-23
Coding Complete Clicked
65
1
10021
981
2022-01-25
Home Button Clicked
20
1
9021
904
2022-01-25
Icon Clicked
40
2
170109-image.png
输入table
create table ##input
(event_time datetime2,
event_type varchar(1000),
user_id varchar(100),
ctextid int,
vbillid int)
insert into ##input values
('1/11/2022 1:21:02 PM','Start Work Clicked','am21','10021','21'),
('1/11/2022 1:46:02 PM','Coding Complete Clicked','am21','10021','21'),
('1/12/2022 1:46:02 PM','Start Work Clicked','am31','78321','561'),
('1/12/2022 1:51:02 PM','Home Button Clicked','am31','78321','561'),
('1/12/2022 2:04:02 PM','VisitBill Button Clicked','am12','78321','561'),
('1/12/2022 2:24:02 PM','Coding Complete Clicked','am12','78321','561'),
('1/12/2022 1:55:02 PM','Start Work Clicked','am78','5561','78'),
('1/12/2022 2:10:02 PM',' Icon Clicked','am78','5561','78'),
('1/12/2022 2:15:02 PM','VisitBill Button Clicked','am89','5561','78'),
('1/12/2022 2:44:02 PM','Coding Complete Clicked','am89','5561','78'),
('1/22/2022 9:55:02 AM','Start Work Clicked','am115','789','89'),
('1/22/2022 10:25:02 AM','Home Button Clicked','am115','789','89'),
('1/22/2022 10:45:02 AM','VisitBill Button Clicked','am115','789','89'),
('1/22/2022 11:10:02 AM',' Icon Clicked','am115','789','89'),
('1/22/2022 11:25:02 AM','VisitBill Button Clicked','am115','789','89'),
('1/22/2022 11:40:02 AM','Coding Complete Clicked','am115','789','89'),
('1/23/2022 9:55:02 AM','Start Work Clicked','am115','9918','890'),
('1/23/2022 10:25:02 AM','Home Button Clicked','am115','9918','890'),
('1/23/2022 10:45:02 AM','VisitBill Button Clicked','am115','9918','890'),
('1/23/2022 11:10:02 AM',' Icon Clicked','am115','9918','890'),
('1/23/2022 11:25:02 AM','VisitBill Button Clicked','am115','9918','890'),
('1/23/2022 11:30:02 AM','VisitBill Button Clicked','am115','9918','890'),
('1/23/2022 11:40:02 AM','Coding Complete Clicked','am115','9918','890'),
('1/25/2022 10:55:02 AM','Start Work Clicked','am115','10021','981'),
('1/25/2022 11:15:02 AM','Home Button Clicked','am115','10021','981'),
('1/25/2022 11:23:02 AM','VisitBill Button Clicked','am115','10021','981'),
('1/25/2022 9:45:02 AM','Start Work Clicked','am118','9021','904'),
('1/25/2022 10:05:02 AM','Home Button Clicked','am118','9021','904'),
('1/25/2022 10:23:02 AM','VisitBill Button Clicked','am120','9021','904'),
('1/25/2022 10:43:02 AM','Icon Clicked','am120','9021','904')
Output table
create table ##output
(ctextid int,
vbillid int,
eventdate date,
comment varchar(1000),
timetakeninminutes float,
distinctnumberofcoders int)
insert into ##output values
('10021','21','44572.5562731481','coding completed','25','1'),
('78321','561','44573.5771064815','coding completed','25','2'),
('5561','78','44573.5937731481','coding completed','44','2'),
('789','89','44583.4479398148','coding completed','70','1'),
('9918','890','44584.4479398148','coding completed','65','1'),
('10021','981','44586.4687731481','coding incomplete','20','1'),
('9021','904','44586.4465509259','coding incomplete','40','2')
首先,您需要构建一个地图,在这些事件之间计算时间。 然后你按 event_time 的顺序排列数据,然后你只计算所有这些出现的次数。 请试试这个代码:
WITH map AS (
SELECT *
FROM VALUES('Start Work Clicked', 'Coding Complete Clicked')
,('Start Work Clicked', 'Home Button Clicked')
,('Start Work Clicked', 'Icon Clicked')
,('VisitBill Button Clicked', 'Coding Complete Clicked')
,('VisitBill Button Clicked', 'Home Button Clicked')
,('VisitBill Button Clicked', 'Icon Clicked') AS t(first_event_type, second_event_type)
), ip AS (
SELECT *, CAST(event_time AS DATE) AS eventdate, ROW_NUMBER() OVER(PARTITION BY ctextid, vbillid, eventdate, user_id ORDER BY event_time) AS rn
FROM input
), gaps AS (
SELECT fi.ctextid
, fi.vbillid
, fi.user_id
, fi.event_time
, fi.eventdate
, m.second_event_type AS comment
, SUM(TIMEDIFF(minute, fi.event_time, si.event_time)) AS timetakeninminutes
FROM map AS m
JOIN ip AS fi ON TRIM(fi.event_type) = TRIM(m.first_event_type)
JOIN ip AS si ON TRIM(si.event_type) = TRIM(m.second_event_type)
AND fi.ctextid = si.ctextid
AND fi.vbillid = si.vbillid
AND fi.user_id = si.user_id
AND CAST(fi.event_time AS DATE) = CAST(si.event_time AS DATE)
AND fi.rn + 1 = si.rn
GROUP BY fi.ctextid, fi.vbillid, fi.user_id, fi.eventdate, comment, fi.event_time
)
SELECT DISTINCT
ctextid
, vbillid
, eventdate
, LAST_VALUE(comment) OVER(PARTITION BY ctextid, vbillid, eventdate ORDER BY event_time) AS comment
, SUM(timetakeninminutes) OVER(PARTITION BY ctextid, vbillid, eventdate) AS timetakeninminutes
, COUNT(DISTINCT user_id) OVER(PARTITION BY ctextid, vbillid, eventdate) AS distinctnumberofcoders
FROM gaps
ORDER BY eventdate, ctextid DESC, vbillid;
查询结果:
CTEXTID | VBILLID | EVENTDATE | COMMENT | TIMETAKENINMINUTES | DISTINCTNUMBEROFCODERS |
---|---|---|---|---|---|
10021 | 21 | 2022-01-11 | Coding Complete Clicked | 25 | 1 |
78321 | 561 | 2022-01-12 | Coding Complete Clicked | 25 | 2 |
5561 | 78 | 2022-01-12 | Coding Complete Clicked | 44 | 2 |
789 | 89 | 2022-01-22 | Coding Complete Clicked | 70 | 1 |
9918 | 890 | 2022-01-23 | Coding Complete Clicked | 65 | 1 |
10021 | 981 | 2022-01-25 | Home Button Clicked | 20 | 1 |
9021 | 904 | 2022-01-25 | Icon Clicked | 40 | 2 |