Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 将以小时差分隔的交错记录分组_Postgresql_Grouping_Partitioning - Fatal编程技术网

Postgresql 将以小时差分隔的交错记录分组

Postgresql 将以小时差分隔的交错记录分组,postgresql,grouping,partitioning,Postgresql,Grouping,Partitioning,这是一个很难回答的问题,但我正试图复制社交媒体或通知源在对最近的事件进行批处理时所做的工作,以便它们能够显示动作的“序列”。例如,如果这些类似于记录,则按相反的时间顺序: like_id | user_id | like_timestamp -------------------------------- 1 | bob | 12:30:00 2 | bob | 12:29:00 3 | jane | 12:27:00 4

这是一个很难回答的问题,但我正试图复制社交媒体或通知源在对最近的事件进行批处理时所做的工作,以便它们能够显示动作的“序列”。例如,如果这些类似于记录,则按相反的时间顺序:

like_id | user_id |   like_timestamp
--------------------------------
1       | bob     | 12:30:00
2       | bob     | 12:29:00
3       | jane    | 12:27:00
4       | bob     | 12:26:00
5       | jane    | 12:24:00
6       | jane    | 12:23:00
7       | scott   | 12:22:00
8       | bob     | 12:20:00
9       | alice   | 12:19:00
10      | scott   | 12:18:00
我想把它们分组,这样我就可以得到最后3次用户喜欢的东西,分组分区?按用户。如果突发规则是相隔不到5分钟的类属于同一突发,则我们将得到:

user_id | num_likes | burst_start | burst_end
----------------------------------------------
bob     | 3         | 12:26:00    | 12:30:00
jane    | 3         | 12:23:00    | 12:27:00
scott   | 2         | 12:18:00    | 12:22:00
alice's like不被计算,因为它是第四批最新产品的一部分,而like 8不被添加到bob的计数中,因为它比下一批产品早6分钟

我曾尝试使用postgres的滞后函数跟踪突发事件,该函数允许我标记开始和结束事件,但由于相似事件可以交错排列,因此我无法将相似事件绑定到其发起人,例如,将id 4绑定到2

这个分组可能吗?如果是这样,是否可以跟踪每个突发的开始和结束时间戳

CTE用于为每个用户创建一个有序的组id。因此,这里的第一个用户(最近的用户)获得最低的组id,即bob。第二个用户是第二高的jane,以此类推。这是用来在一个分区内与某个用户的所有类似对象一起工作的。这一步是必要的,因为您不能简单地按用户id订购,这将使alice名列前茅。限制3将整个查询限制为前三个用户。 加入计算出的用户组id后,将使用计算出的时间差,这允许您获取以前的值。因此,它可以很容易地计算当前时间戳与前一个时间戳之间的差异。这只发生在用户的组中。 之后,可以通过计算出的差值,将距离最后一个相隔5分钟以上的相似项删除 然后,可以使用第一个_值窗口函数升序和降序计算最高和较低的时间戳。这些标志着你的爆发开始和爆发结束 最后,您可以对所有用户进行分组并统计他们的记录。
听起来您想使用col而不是start和end。您使用的是哪个Postgres版本?请提供表定义CREATE table语句,显示数据类型和约束、Postgres版本以及您尝试的内容。
WITH group_ids AS (   -- 1
    SELECT DISTINCT
        user_id,
        first_value(like_id) OVER (PARTITION BY user_id ORDER BY like_id) AS group_id
    FROM
        likes
    LIMIT 3
)
SELECT 
    user_id,
    COUNT(*) AS num_likes,
    burst_start,
    burst_end
FROM (
    SELECT
        user_id,
        -- 4
        first_value(like_timestamp) OVER (PARTITION BY group_id ORDER BY like_id) AS burst_end,
        first_value(like_timestamp) OVER (PARTITION BY group_id ORDER BY like_id DESC) AS burst_start
    FROM (
        SELECT
            l.*, gi.group_id,
            -- 2
            lag(like_timestamp) OVER (PARTITION BY group_id ORDER BY like_id) - like_timestamp AS diff
        FROM
            likes l 
        JOIN
            group_ids gi ON l.user_id = gi.user_id
    ) s
    WHERE diff IS NULL OR diff <= '00:05:00'  -- 3
) s
GROUP BY user_id, burst_start, burst_end  -- 5