我需要回答这样的问题:
对于每个用户,用户在任何60秒内查看的最多项是什么
START_TIMESTAMP
和END_TIMESTAMP
之间的时间范围?
60秒的时间范围是一个滑动窗口 。这不仅仅是每一分钟“被查看的项目”的问题。此外,60秒只是一个例子,它应该可以工作任何秒数。
我的数据存储方式如下:
-- Timestamped log of users viewing items
CREATE TABLE user_item_views (
user_id integer,
item_id integer,
timestamp timestamp
);
每分钟完成这一操作非常简单,只需将时间戳格式化为YYYY-MM-DD hh:mm
,并按照格式化的时间戳和user_id进行分组。
为滑动窗口做这件事,我不知道如何接近。
如果在SQL之外这样做会更容易,我可以将数据导出为其他格式,或使用其他语言。
所需的输出类似于:
User ID Max items viewed in N seconds, between START and END.
... ...
... ...
... ...
我该怎么做?
答案 0 :(得分:0)
在MySQL中(假设timestamp
是唯一的):
SELECT
user_id
, MAX(max_count) AS max_count
FROM
( SELECT
a.user_id
, COUNT(*) AS max_count
FROM
user_item_views AS a
JOIN
user_item_views AS b
ON a.user_id = b.user_id
AND a.timestamp <= b.timestamp
AND b.timestamp < a.timestamp + INTERVAL 60 SECOND
GROUP BY
a.user_id
, a.timestamp
) AS grp
GROUP BY
user_id