一、连续问题(14 天连续登录)
假设您有一个user_login表,包含user_id(用户ID)和log_date(用户每次登录的时间戳)字段,我们想要找出连续10天登录过的用户。下面是一个更简洁易懂的解释以及对应的SQL查询模板:
实现思路:
代码实现
SELECT user_id, MAX(count_num) AS max_count -- 查出了最大连续登陆,where>=14,即14天连续
FROM (
-- group by相同日期
SELECT user_id, diff_date, COUNT(*) AS count_num
FROM (
-- 日期减rank,连续登陆的话,会得到相同日期
SELECT user_id, log_date, date_sub(log_date, CAST(rn AS INT)) AS diff_date
FROM (
-- 打上rank标识
SELECT user_id, log_date, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY log_date) AS rn
FROM user_login
) c
) d
GROUP BY user_id, diff_date
) e
GROUP BY user_id;
用一条 SQL 语句查询 女朋友首次购买各类化妆品的记录。
可以使用SQL的窗口函数或者子查询来找到每个用户的首次购买记录。下面是一个使用SQL查询来解决这个问题的示例:
假设你有一个名为purchases的表,其中包含以下字段:
你可以使用以下SQL查询来找到每个用户的首次购买产品的ID:
代码实现
WITH RankedPurchases AS (
SELECT
user_id,
product_id,
purchase_date,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY purchase_date ASC) AS rn
FROM
purchases
)
SELECT
user_id,
product_id AS first_purchased_product_id
FROM
RankedPurchases
WHERE
rn = 1;
这个查询的工作原理
执行这个查询后,你将得到一个包含每个用户及其首次购买产品ID的结果集。
用一条 SQL 语句查询高三8班,每门课都大于 90 分的学生清单。
思路:如果分数最少的课程都大于90分,那所有的课程分数,肯定都大于90分!
代码实现
SELECT name
FROM xuesheng
GROUP BY name
HAVING MIN(score)> 90