我有一个包含以下行的表日志。 对于每个给定的日志案例,我都有以下日志
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
样本数据:
答案 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