【问题标题】:How to filter on duration based on timestamp values如何根据时间戳值过滤持续时间
【发布时间】:2021-01-02 11:54:41
【问题描述】:

我想根据时间间隔过滤记录,但我有时间戳。我有一个包含以下列名称的表“df”:

id - 整数 时间 - 时间戳 正确性 - 布尔值 主题 - 文字

每个学生 (id) 完成特定主题 (subject) 的任务。如果分配正确完成,系统在“正确性”列中分配“真”值,否则在“错误”列中分配。学生完成任务的时间(时间)也被系统保存。

我需要编写一个 sql 查询来统计 2020 年 3 月期间在一个小时内成功完成 20 项任务的所有学生。我需要计算从实际开始时间到实际完成时间的一小时内完成任务的学生。

提前致谢!

【问题讨论】:

  • 我需要从实际开始时间到实际完成时间计算一小时内完成任务的人。 'Date_trunc' 不提供此功能

标签: sql postgresql datetime count window-functions


【解决方案1】:

您可以使用窗口函数和范围框架:

select distinct id
from (
    select 
        t.*, 
        count(*) filter(where correctness) over(
            partition by id 
            order by time 
            range between interval '1 hour' preceding and current row
        ) cnt
    from mytable t
    where time >= date '2020-03-01' and time < date '2020-04-01'
) t
where cnt > 20

窗口函数计算同一用户在过去一小时内成功执行的任务数;然后,您可以使用此信息过滤结果集。

这会为您提供满足条件的用户列表。如果您想要此类用户的计数,请将select distinct id 替换为select count(distinct id)

【讨论】:

  • 谢谢,但我需要计算从实际开始时间到实际完成时间的一个小时内完成任务的人。
  • @Alex:这就是查询的作用……你试过了吗?
  • 是的,它有效,但正确性没有。我修改了正确性 = 'True',但它仍然包含具有 'True' 和 'False' 值的观察结果。
  • @Alex:您没有指定如何处理底片。你说你想要用户并且在一小时内至少有 20 个肯定的用户 - 查询就是这样做的。
猜你喜欢
  • 2018-09-11
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多