我有一个这样的用户表,

name      week_no   year_no
fb        5         2021
twitter   1         2022
twitter   2         2022
twitter   3         2022
twitter   7         2022
youtube  21         2022

我想要找到在同一年中连续3周登录的用户名.每一年的周数字都是唯一的.例如,在上表中,我们可以看到用户twitter在同年2022登录到week_no: 1, 2, 3,从而满足了我正在寻找的条件.

我正在寻找的输出,

name        year_no
twitter     2022

可以使用以下命令创建示例表:

CREATE TABLE test (
    name varchar(20),
    week_no int,
    year_no int
);
INSERT INTO test (name, week_no, year_no)
VALUES ('fb', 5, 2021), 
       ('twitter', 1, 2022),
       ('twitter', 2, 2022),
       ('twitter', 3, 2022), 
       ('twitter', 7, 2022),
       ('youtube', 21, 2022);

我是SQL语言的新手,我读到GROUP BY可以实现这一点,有人能帮助我们使用什么函数/查询来实现同样的目标吗?

select * from test group by year_no, name;

提前感谢您的帮助.

推荐答案

一个简单的解决方案,可以在每个MySQL版本上运行,而不需要使用Windows函数.将同一张表联接3次

SELECT t1.name,t1.year_no
FROM   test t1
INNER JOIN   test t2 ON t1.name=t2.name AND t1.year_no=t2.year_no
INNER JOIN   test t3 ON t1.name=t3.name AND t1.year_no=t3.year_no
WHERE  t2.week_no = t1.week_no + 1 
AND    t3.week_no = t1.week_no + 2 

https://dbfiddle.uk/XjeXKUFE

Mysql相关问答推荐

左联接重复问题

MySQL RDS ALTER TABLE ENUM短暂中断了我的数据库连接

运行简单查询时Prisma预准备语句错误

没有 ORDER BY 的查询性能很高,有 ORDER BY 的查询速度慢得像爬行一样

将上传文件的存储路径放在一张表中的缺点是什么?

按优先级 for each 具有 status_id 的员工 Select 单行

排序子查询结果并返回每个 ID 的第一行

如何使用等于、喜欢和不等于在 json 字段上编写查询?

MySQL函数 - 如何对select查询应用多个条件

如何在 WampServer 上重新初始化 MySQL 以允许 lower_case_table_names = 2

我在 mysql 查询中需要帮助,我想在年龄之间按年龄过滤器分组,并显示 0 计数之间找不到的数据

当用它的别名替换 (MAX(s.salary) - MIN(s.salary) 它将不起作用.. 为什么?

MySql中的可见索引和不可见索引是什么

Golang Gorm:相同的查询构造不同,抛出不同的结果

Over() 函数不覆盖表中的所有行

主键应该始终是无符号的?

#1146 - 表 'phpmyadmin.pma_recent' 不存在

将sql查询的结果写入mysql中的文件

"SELECT COUNT(*)" 很慢,即使有 where 子句

按 COUNT(*) 过滤?