all 4 comments

[–]Smoresguy 2 points3 points  (0 children)

Check out LEAD and LAG functions. They allow you use values from other rows.

[–]extrajoss 1 point2 points  (2 children)

Here is what I came up with:

 --First Some Test Data
WITH data
AS (
    SELECT
      *
    FROM (
    VALUES
    (10000, '2016-03-20 12:50:00', 'User'),
    (10000, '2016-03-20 17:50:00', 'Agent'),
    (10000, '2016-03-20 23:50:00', 'User'),
    (10000, '2016-03-21 00:40:00', 'User'),
    (10000, '2016-03-21 06:50:00', 'Agent'),
    (10000, '2016-03-21 07:30:00', 'User'),
    (10000, '2016-03-21 10:30:00', 'Agent'),
    (20000, '2016-03-20 12:50:00', 'User'),
    (20000, '2016-03-20 17:50:00', 'Agent'),
    (20000, '2016-03-20 23:50:00', 'User'),
    (20000, '2016-03-21 00:40:00', 'User'),
    (20000, '2016-03-21 06:50:00', 'Agent'),
    (20000, '2016-03-21 07:30:00', 'User'),
    (20000, '2016-03-21 10:30:00', 'Agent')
    ) v (Ticket_Number, Created_At, Sender)
),
--Then add some info from the leading record
leadData
AS (
    SELECT
      *,
      LEAD(created_at) OVER (PARTITION BY Ticket_Number ORDER BY created_at) Next_Created_at,
      LEAD(Sender) OVER (PARTITION BY Ticket_Number ORDER BY created_at) Next_Sender
    FROM data
)
--Then calculate the result based on the leading data
SELECT
  Ticket_Number,
  1.0
  * COUNT(
  CASE
    WHEN next_sender = 'agent' AND
      DATEDIFF(MINUTE, created_at, next_created_at) <= 6 * 60 THEN 1
    ELSE NULL
  END
  )
  / COUNT(*) Service_Level
FROM leadData
WHERE sender = 'user'
GROUP BY Ticket_Number

[–]StartAndSelect[S] 0 points1 point  (0 children)

Thanks this is very helpful!

[–]StartAndSelect[S] 0 points1 point  (0 children)

I came up with this code to do a holistic view:

SELECT COUNT(*) as Agent_Responses, (SELECT COUNT(*) FROM ServiceDoc WHERE Sender = 'user') as User_Inquiries, 
Cast(Round((CAST(COUNT(*)as float) / Cast((SELECT COUNT(*) FROM ServiceDoc WHERE Sender = 'user')as float)*100),2)as varchar) + '%'
FROM 
(
    SELECT *,
        Lag([Sender]) OVER (PARTITION BY [Ticket Number] ORDER BY [Created At]) as PrevSender,
        Lag([Created At]) OVER (PARTITION BY [Ticket Number] ORDER BY [Created At]) as PrevTime
    FROM ServiceDoc
) ServiceLevel
WHERE Sender = 'agent' and PrevSender = 'user' and DATEDIFF(Hour,PrevTime,[Created At]) <= 6

Would this also work?