如何在特定时间范围内计算任何N秒持续时间的SQL MAX()

时间:2012-01-18 16:27:17

标签: sql

我需要回答这样的问题:

  

对于每个用户,用户在任何60秒内查看的最多项是什么   START_TIMESTAMPEND_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.
...      ...
...      ...
...      ...

我该怎么做?

1 个答案:

答案 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