要解决这个问题,可以使用窗口函数来对数据进行分组和排序,并利用日期函数来判断是否存在连续5天的上网记录。

以下是一个示例的SQL查询,假设表名为'access_records',字段名为'time'、'user_id'和'url':

WITH ranked_records AS (
  SELECT
    user_id,
    time,
    ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY time) AS rn
  FROM
    access_records
  ORDER BY
    user_id, time
),
consecutive_records AS (
  SELECT
    user_id,
    time,
    DATE_TRUNC('day', time) AS day,
    DATE_TRUNC('day', LAG(time) OVER (PARTITION BY user_id, DATE_TRUNC('day', time) ORDER BY time)) AS prev_day
  FROM
    ranked_records
)
SELECT
  user_id
FROM
  consecutive_records
GROUP BY
  user_id, day
HAVING
  COUNT(*) >= 5
  AND COUNT(DISTINCT prev_day) = 1;

此查询使用两个CTE(公共表表达式)来处理数据。首先,'ranked_records'对记录进行分组,并为每个用户的记录添加一个连续编号。然后,'consecutive_records'使用窗口函数LAG来查找前一天的记录,并将时间戳截断为天。

最后,查询从'consecutive_records'中选择具有连续5天记录的用户,并检查前一天的日期是否是相同的(即连续)。

请注意,这只是一个示例查询,具体实现可能因数据库类型和表结构而有所不同。你需要根据自己的情况进行调整和优化。


原文地址: https://www.cveoy.top/t/topic/o6F0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录