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