使用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”子句来强制分组