SQL笔试题
一个app需要每天签到,(签到显示1,未签到显示0)我们需要计算连续7天签到的用户有多少人
表名:activity_log
- id:记录的唯一标识符
- activity_date:活动的日期
WITH RankedActivities AS (
SELECT
id,
activity_date,
DATEDIFF(day, LAG(activity_date) OVER (ORDER BY activity_date), activity_date) AS day_diff
FROM
activity_log
)
SELECT
id,
activity_date
FROM
RankedActivities
WHERE
day_diff BETWEEN 0 AND 1
GROUP BY
id
HAVING
COUNT(*) = 7
这个查询的逻辑是这样的:
- 使用WITH子句创建一个临时的结果集RankedActivities。
- 在这个临时结果集中,使用LAG函数获取每条记录的前一条记录的activity_date,并使用DATEDIFF函数计算与当前记录的日期差(day_diff)。
- 筛选出日期差在0到1天之间的记录,即连续的记录。
- 按id分组,并使用HAVING子句确保每个组内的记录数恰好为7,即连续7天的记录。
请注意,这个查询假设activity_date列的数据类型是日期类型,并且表中没有缺失的日期记录。如果你的数据表结构或数据库系统与上述示例不同,你可能需要调整查询语句以适应你的实际情况。如果你提供具体的数据库表结构和使用的数据库系统,我可以给出更精确的查询方法。