首页 > 解决方案 > 如何根据时间戳值过滤持续时间

问题描述

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

id - int 时间 - 时间戳正确性 - 布尔主题 - 文本

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

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

提前致谢!

标签: sqlpostgresqldatetimecountwindow-functions

解决方案


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

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 idselect count(distinct id).


推荐阅读