SQL MaxSum 查询为列选择了错误的值

问题描述 投票:0回答:1

我有这个 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
sql mysql database aggregate-functions
1个回答
0
投票

根据我在上面评论中的链接,以这种方式滥用 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
© www.soinside.com 2019 - 2024. All rights reserved.