根据 SQL 中另一列中特定 ID 的条件计算持续时间
Calculate Duration based on a criteria in another column in SQL for specific IDs
我有一个名为 Audit 的 table,如下所示:
ID
Record
AccessedDTTM
16
Sign In
2021-03-23 04:41:33.770
16
Session End - Sign Out
2021-03-23 04:42:33.770
17
Sign In
2021-03-01 00:03:04.070
17
Session End - Sign Out
2021-03-01 00:33:52.717
18
Sign In
2021-03-01 01:31:00.527
18
Schedule
2021-03-01 01:31:31.407
18
Charge
2021-03-01 01:43:27.427
18
Session End - Sign Out
2021-03-01 01:47:27.940
我需要计算 Id 为 16 和 18 的用户访问的持续时间。持续时间应基于他们的登录记录和会话结束 - 注销条目。
我试过这个查询:
select DateDiff(秒,(Select AccessedDTTM from Audit Where Record = 'Sign In'),(Select AccessedDTTM from Audit Where Record = 'Session End - Sign Out'))
作为持续时间 Foom 审计
其中 ID 在 (16, 18)
但是我收到如下错误:
子查询返回了 1 个以上的值。当子查询跟在 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。
有人可以帮我进行正确的查询来获得这个结果吗?提前致谢!
您可以使用条件聚合:
select id,
datediff(second,
min(case when Record = 'Sign in' then AccessedDTTM end),
max(case when Record = 'Session End - Sign Out' then AccessedDTTM end)
) as diff
from audit
where id in (16, 18)
group by id;
对数据做出一些合理的假设,你可以将其简化为:
select id,
datediff(second, min(AccessedDTTM), max(AccessedDTTM)
) as diff
from audit
where id in (16, 18) and
record in ('Sign in', 'Session End - Sign Out')
group by id;
我有一个名为 Audit 的 table,如下所示:
ID | Record | AccessedDTTM |
---|---|---|
16 | Sign In | 2021-03-23 04:41:33.770 |
16 | Session End - Sign Out | 2021-03-23 04:42:33.770 |
17 | Sign In | 2021-03-01 00:03:04.070 |
17 | Session End - Sign Out | 2021-03-01 00:33:52.717 |
18 | Sign In | 2021-03-01 01:31:00.527 |
18 | Schedule | 2021-03-01 01:31:31.407 |
18 | Charge | 2021-03-01 01:43:27.427 |
18 | Session End - Sign Out | 2021-03-01 01:47:27.940 |
我需要计算 Id 为 16 和 18 的用户访问的持续时间。持续时间应基于他们的登录记录和会话结束 - 注销条目。
我试过这个查询: select DateDiff(秒,(Select AccessedDTTM from Audit Where Record = 'Sign In'),(Select AccessedDTTM from Audit Where Record = 'Session End - Sign Out')) 作为持续时间 Foom 审计 其中 ID 在 (16, 18)
但是我收到如下错误: 子查询返回了 1 个以上的值。当子查询跟在 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。
有人可以帮我进行正确的查询来获得这个结果吗?提前致谢!
您可以使用条件聚合:
select id,
datediff(second,
min(case when Record = 'Sign in' then AccessedDTTM end),
max(case when Record = 'Session End - Sign Out' then AccessedDTTM end)
) as diff
from audit
where id in (16, 18)
group by id;
对数据做出一些合理的假设,你可以将其简化为:
select id,
datediff(second, min(AccessedDTTM), max(AccessedDTTM)
) as diff
from audit
where id in (16, 18) and
record in ('Sign in', 'Session End - Sign Out')
group by id;