Reputation: 421
Hope you are doing well!.. An encounter is a combination of ctextid and vbillid.. There are multiple events that place before an encounter is coding completed.. Sometimes the tasks don't get coding completed at all... Following represents the tasks flow (eventtype) for which the difference in the event time should be calculated in minutes...Please find below the input and the output tables...can you please help me here.. Distinctnumberofcoders is calculated as distinct count of user_id)..
170109-image.png
Input 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')
Upvotes: 1
Views: 334
Reputation: 2069
First, you need to build a map between which events you count time. Then you arrange the data in the order event_time and then you just count all these occurrences. Please try this code:
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;
Query result:
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 |
Upvotes: 1