sql - 查找在“%Y-%m”中给出最低平均评分的用户
问题描述
共有三个表:Movies、Users和Rating具有以下结构:
Movies(id int, title text);
Users(id int, name text);
Rating(movie_id int, user_id int, rating int, created_at date);
我正在尝试使用以下查询查找在 2019 年 5 月给出最低平均评分的用户的名称:
select name
from users
where id =
(
select user_id from
(
select user_id, min(avgrating)
from
(
select user_id, avg(rating) as avgrating
from Rating
where strftime('%Y-%m', created_at) = '2019-05'
group by user_id
)
)
);
有两个用户 Ben和Nicole,但上面的查询只返回 Ben。
电影内容:
id title
1, 'Avengers:Endgame'
2, 'Aladdin'
3, 'Aquaman'
用户内容:
id name
1, 'Ben'
2, 'Nicole'
3, 'James'
4, 'Tara'
评分内容:
movie_id, user_id, rating, created_at
1, 1, 3, '2019-05-07 00:10:00'
1, 2, 4, '2019-04-28 09:00:00'
1, 3, 5, '2019-05-11 10:40:00'
1, 4, 4, '2019-05-02 09:30:00'
2, 1, 4, '2019-06-16 08:00:00'
2, 2, 3, '2019-05-30 09:00:00'
2, 3, 4, '2019-06-01 13:50:00'
3, 1, 5, '2019-01-05 09:55:00'
3, 2, 4, '2019-01-28 10:00:00'
解决方案
在 SQLite 3.25 或更高版本中,您可以使用rank()
:
select name
from (
select u.name, rank() over(order by r.rating) rn
from rating r
inner join users u on u.id = r.user_id
where r.created_date >= '2019-05-01' and r.created_date < '2019-06-01'
) t
where rn = 1
在早期版本中,我会使用一个子查询来检索该月的最低评分,然后加入评分和用户:
select u.name, rank() over(order by r.rating) rn
from rating r
inner join users u on u.id = r.user_id
where
r.created_date >= '2019-05-01' and r.created_date < '2019-06-01'
and r.rating = (
select min(r1.rating)
from rating r1
where r1.created_date >= '2019-05-01' and r1.created_date < '2019-06-01'
)
推荐阅读
- sql - 重命名 PostgreSQL 模式/表的最快方法是什么,包括视图、函数/存储过程、索引
- reactjs - 反应——空的帖子正文
- swift - 删除 Swift 链表中的元素
- python - 我的冷却装饰器无法正常工作,我该如何解决?
- laravel-5.8 - Laravel刀片文件无法查看
- python - 如何使用 For 循环遍历对象(保存在列表中)?
- javascript - 如何根据条件使用Angular检测输入类型
- r - 在数据 R 中分配子组
- android-studio - Gradle - 无法获取配置容器的未知属性“scm”
- ios - 如何为 Xcode 调试器设置断点断言 asCopy 错误