计算第二行和第三行之间的时差

时间:2019-07-24 05:30:41

标签: sql sql-server

我有一个包含以下行的表日志。 对于每个给定的日志案例,我都有以下日志

Time                        result in seconds    
2019-04-01 08:34:00.000     100
2019-04-01 08:33:00.000     3600
2019-04-01 08:32:00.000     
2019-04-01 08:31:00.000    

现在我只需要每次计算第二行和第三行之间的时间差。 请建议

代码:

     WITH CTE
          AS
          (
     SELECT dbo.ConvertUnixTime (act.last_mod_dt) as 'Last Modified Time'
        ,dbo.ConvertUnixTime (act.system_time) as 'SystemTime'
        ,ISNULL(cnt.last_name, '') + ', ' + ISNULL(cnt.first_name,'') as 'Created By'
        ,dbo.ConvertUnixTime (act.time_stamp) as 'systime'
        , act.[description] as 'Description'
        ,act.[action_desc] as 'System Description'
        ,acttype.sym as 'Activity Type'
        ,act.time_spent as 'Time Spent'
        ,act.zManualTimeSpent as 'Manual Time Spent',
    ROW_NUMBER() OVER(ORDER BY act.id ) RN
    -- ROW_NUMBER generated based on ORDER BY Time DESC
    -- You can also add case_id or any other column to generate
    --ROW_NUMBER so that the time differences can be calculate 
    --based on other dimension.
from act_log act with (Nolock)
INNER JOIN call_req cr with (nolock) on cr.persid = act.call_req_id
INNER JOIN ca_contact cnt with (nolock) on act.analyst = cnt.contact_uuid
INNER JOIN act_type acttype with (nolock) on act.[type] = acttype.code
where  cr.ref_num = '23179247'
)
SELECT *,
CASE 
    WHEN RN = 3 THEN
    --Please SET RN = Any row number 
    --in which row you wants to show the result 
        DATEDIFF(
            SECOND,
            (SELECT SystemTime FROM CTE WHERE RN = 2),
            (SELECT SystemTime FROM CTE WHERE RN = 3)
            -- By setting RN = 3 and 2, I am calculating 
            -- Time differences between ROW 3 and 2
            -- You can set it to any Row number as per your requirement
        )
    ELSE 0
END
FROM CTE

样本数据:

enter image description here

2 个答案:

答案 0 :(得分:0)

我想像您可能会做一些诸如分析通话记录之类的事情,并且通话会通过以下4种状态进行:已应答,已保留,已保留,已完成,您想知道通话持续了多长时间保持住

with dat as (
SELECT CAST('2019-04-01 08:34:00.000' as datetime) as dt UNION ALL
SELECT CAST('2019-04-01 08:33:00.000' as datetime) as dt UNION ALL
SELECT CAST('2019-04-01 08:32:00.000' as datetime) as dt UNION ALL
SELECT CAST('2019-04-01 08:31:00.000' as datetime) as dt
)


SELECT
  dt,
  CASE WHEN ROW_NUMBER() OVER(ORDER BY dt) = 3 THEN
    DATEDIFF(SECOND, LAG(dt) OVER(ORDER BY dt), dt) END as diff 
FROM
  dat

这可能不是非常有用,因为它仅分析单个呼叫。我们可以对其进行升级以进行多次通话:

with dat as (
SELECT 1 as callid, CAST('2019-04-01 08:34:00.000' as datetime) as dt UNION ALL
SELECT 1 as callid, CAST('2019-04-01 08:33:00.000' as datetime) as dt UNION ALL
SELECT 1 as callid, CAST('2019-04-01 08:32:00.000' as datetime) as dt UNION ALL
SELECT 1 as callid, CAST('2019-04-01 08:31:00.000' as datetime) as dt UNION ALL
SELECT 2 as callid, CAST('2019-04-01 08:44:00.000' as datetime) as dt UNION ALL
SELECT 2 as callid, CAST('2019-04-01 08:43:30.000' as datetime) as dt UNION ALL
SELECT 2 as callid, CAST('2019-04-01 08:42:00.000' as datetime) as dt UNION ALL
SELECT 2 as callid, CAST('2019-04-01 08:41:00.000' as datetime) as dt
)


SELECT
  callid,
  dt,
  CASE WHEN ROW_NUMBER() OVER(PARTITION BY callid ORDER BY dt) = 3 THEN
    DATEDIFF(SECOND, LAG(dt) OVER(PARTITION BY callid ORDER BY dt), dt) END as diff 
FROM
  dat

请注意,我在这里的行是按升序排列的。您的行数递减;如果行数超过4,则可能会对被视为“第二行和第三行”的内容产生影响。您可以根据需要ORDER BY dt DESC

答案 1 :(得分:0)

请检查以下脚本是否满足您的要求-

WITH CTE
AS
(
    SELECT 
    *,
    ROW_NUMBER() OVER(PARTITION BY [case number] ORDER BY Time DESC) RN
    -- ROW_NUMBER generated based on ORDER BY Time DESC
    -- You can also add case_id or any other column to generate
    --ROW_NUMBER so that the time differences can be calculate 
    --based on other dimension.
    FROM your_table
)

SELECT A.*,
CASE 
    WHEN A.RN = 3 THEN
    --Please SET RN = Any row number 
    --in which row you wants to show the result 
        DATEDIFF(
            SECOND,
            (SELECT Time FROM CTE WHERE RN = 3 AND [case number] = A.[case number]),
            (SELECT Time FROM CTE WHERE RN = 2 AND [case number] = A.[case number])
            -- By setting RN = 3 and 2, I am calculating 
            -- Time differences between ROW 3 and 2
            -- You can set it to any Row number as per your requirement
        )
    ELSE 0
END
FROM CTE A