使用max()进行sqlite自连接查询

时间:2017-09-19 05:02:24

标签: 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 |     2 | 2017-09-02 |
|  6 |       3 |     1 | 2017-09-02 |

需要找到任何给定日期具有最高分数的user_ids(可能有多个),所以我正在尝试:

  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

查询在最后2个日期正确返回,但在第一个日期('2107-08-31')返回0记录,它应该返回1的分数

为什么第一个日期不能正确返回和/或是否有更优雅的方式来编写此查询?

这是最接近工作的查询版本,但只有一个测试分数时它不起作用。我不明白我如何在聚合中不使用GROUP BY子句。

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

1 个答案:

答案 0 :(得分:2)

正确的查询选项是:

SELECT user_id
FROM scores 
WHERE score = (SELECT MAX(score) FROM scores WHERE date = '2017-08-01')

请注意,查询的一个问题(可能是您的问题)是子查询中的user_id和日期与包含MAX(得分)的行无关,因为您没有任何" group by"强制分组的条款