使用max()的sqlite自连接查询
鉴于下表:使用max()的sqlite自连接查询,sql,sqlite,subquery,self-join,Sql,Sqlite,Subquery,Self Join,鉴于下表: | id | user_id | score | date | |----|---------|-------|------------| | 1 | 1 | 1 | 2017-08-31 | | 2 | 1 | 1 | 2017-09-01 | | 3 | 2 | 2 | 2017-09-01 | | 4 | 1 | 2 | 2017-09-02 | | 5 | 2 |
| id | user_id | score | date |
|----|---------|-------|------------|
| 1 | 1 | 1 | 2017-08-31 |
| 2 | 1 | 1 | 2017-09-01 |
| 3 | 2 | 2 | 2017-09-01 |
| 4 | 1 | 2 | 2017-09-02 |
| 5 | 2 | 2 | 2017-09-02 |
| 6 | 3 | 1 | 2017-09-02 |
需要查找在任何给定日期(可以有多个日期)具有最大分数的用户ID,因此我正在尝试:
SELECT s1.user_id
FROM (
SELECT max(score) as max, user_id, date
FROM scores
) AS s2
INNER JOIN scores as s1
ON s1.date = '2017-08-31'
AND s1.score = s2.max
查询在最后两个日期正确返回,但在第一个日期('2107-08-31')返回0条记录,它应该返回1分
为什么第一个日期不能正确返回和/或是否有更优雅的方式编写此查询
下面是最接近工作的查询版本,尽管只有一个测试分数时它不工作。我不明白我怎么能不在聚合中使用GROUPBY子句
SELECT s1.user_id
FROM (
SELECT max(score) as max, user_id, date
FROM scores
) AS s2
INNER JOIN scores as s1
ON s1.date = :date
AND s1.score = s2.max
正确的查询选项是:
SELECT user_id
FROM scores
WHERE score = (SELECT MAX(score) FROM scores WHERE date = '2017-08-01')
请注意,查询的一个问题(可能是您的问题)是子查询中的用户id和日期与包含MAX(分数)的行不相关,因为您没有任何“group by”子句来强制分组正确的查询选项是:
SELECT user_id
FROM scores
WHERE score = (SELECT MAX(score) FROM scores WHERE date = '2017-08-01')
请注意,查询的一个问题(可能是您的问题)是子查询中的用户id和日期与包含MAX(score)的行不相关,因为您没有任何“groupby”子句来强制分组