【问题标题】:Calculate Duration based on a criteria in another column in SQL for specific IDs根据 SQL 中另一列中特定 ID 的条件计算持续时间
【发布时间】:2021-09-06 14:12:10
【问题描述】:

我有一个名为 Audit 的表,如下所示:

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(second, (Select AccessedDTTM from Audit Where Record = 'Sign In'), (Select AccessedDTTM from Audit Where Record = 'Session End - Sign Out')) 作为持续时间 Foom 审计 ID 在哪里 (16, 18)

但我收到如下错误: 子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

有人可以帮助我进行正确的查询以实现此结果吗?提前致谢!

【问题讨论】:

  • 跳过子查询,改为 JOIN。
  • 用您正在使用的数据库标记您的问题。

标签: sql datetime duration


【解决方案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;

【讨论】:

  • 谢谢你,戈登,这个查询对我来说就像一个魅力。最大和最小聚合函数完成了这项工作。再次感谢您指导我! :)
猜你喜欢
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2019-08-27
  • 1970-01-01
  • 2014-09-20
  • 2020-07-12
  • 1970-01-01
相关资源
最近更新 更多