【问题标题】:How to count records in given interval?如何计算给定间隔内的记录?
【发布时间】:2020-06-02 08:31:21
【问题描述】:

我有一个带有 created 列的表。我需要检查是否至少有一条记录是在不到一分钟前创建的,从具有相同 user_id 的最后一条记录开始。例如

|            created|user_id|
|2020-01-01T22:22:22|      1|
|2020-01-01T22:22:44|      1|

^ 匹配我的子句。每隔一分钟创建一次。

|            created|user_id|
|2020-01-01T22:22:22|      1|
|2020-01-01T22:24:44|      1|

^ 不匹配,创建时间超过一分钟。

【问题讨论】:

    标签: sql postgresql date greatest-n-per-group window-functions


    【解决方案1】:

    您可以使用distinct on 和窗口函数:

    select distinct on (user_id) 
        user_id,
        created_at 
            <= lag(created_at) over(partition by user_id order by created_at) + interval '1' minute as flag
    from mytable
    order by user_id, created_at desc
    

    这为每个user_id 提供一条记录,并带有一个名为flag 的布尔列,指示最后一个created_at 是比最新的created_at 早一分钟还是少一分钟。

    Demo on DB Fiddle.

    样本数据:

    created_at |用户身份 :----------------- | ------: 2020-01-01 22:22:22 | 1 2020-01-01 22:22:44 | 1 2020-01-01 22:22:22 | 2 2020-01-01 22:24:44 | 2

    结果:

    用户 ID |旗帜 ------: | :--- 1 |吨 2 | F

    【讨论】:

    • 在 200 万行的表上使用是否省钱?我的意思是,那不会挂我的数据库?
    • @senloa:请描述您在查询结果时遇到的问题。
    • 它不起作用,我有 3 条记录的范围超过 1 分钟,并且具有不同的 user_id,它仍然匹配..
    • @senloa:我在答案中添加了一个小提琴。这似乎按预期工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2015-11-06
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多