我有这个 SQL 查询(我使用的是 MySQL 8.0.35):
SELECT MAX(su) as value, activity_id, user_id, u.faculty_id AS faculty_id
FROM (
SELECT SUM(s.distance) as su, s.activity_id as activity_id, s.user_id as user_id, s.date
FROM submission s
WHERE s.week = 2 AND s.accepted = 1 AND s.season_id = 859
GROUP BY s.date, s.user_id, s.activity_id
) as sums
INNER JOIN user u ON user_id = u.id
GROUP BY activity_id;
它的作用是:计算距离的 MAX SUM,并获取“其他”相关列。 结果中可以有多行(最好每个活动一行)。
但是,它为“faculty_id”列返回不正确的值。
我尝试使用几个不同的 WHERE 子句将 INNER JOIN 放在嵌套 SELECT 内部的用户表上,但似乎没有返回正确的结果。
部分用户表:
有了这些数据,我预计结果是:
价值 | activity_id | 用户ID | faculty_id |
---|---|---|---|
456 | 743 | 265 | 3375 |
456 | 744 | 265 | 3375 |
但是,我得到的结果是(注意 coach_id):
价值 | activity_id | 用户ID | faculty_id |
---|---|---|---|
456 | 743 | 265 | 3373 |
456 | 744 | 265 | 3375 |
根据我在上面评论中的链接,以这种方式滥用 GROUP BY 会为您既不聚合也不分组的列返回任意且不确定的结果。
相反,“每组最大 n 个”的正常方法是使用 ROW_NUMBER()...
WITH
sub AS
(
SELECT
SUM(s.distance) as su,
s.activity_id as activity_id,
s.user_id as user_id,
s.date
FROM
submission s
WHERE
s.week = 2
AND s.accepted = 1
AND s.season_id = 859
GROUP BY
s.date,
s.user_id,
s.activity_id
),
sorted AS
(
SELECT
*,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY su DESC
)
AS su_rank
FROM
sub
)
SELECT
*
FROM
sorted AS s
INNER JOIN
user AS u
ON u.id = s.user_id
WHERE
s.su_rank = 1