嵌套分组mysql

Posted

技术标签:

【中文标题】嵌套分组mysql【英文标题】:Nested grouping mysql 【发布时间】:2020-10-27 08:49:17 【问题描述】:

我有一个表results,其中包含以下重要列:

f_team1 (VARCHAR) f_team2 (VARCHAR) f_player1 (VARCHAR) f_player2 (VARCHAR) f_total_ftg (INT)

team 可以在 f_team1f_team2 列中

player 可以在 f_player1f_player2 列中

我正在尝试为每个玩家找到 f_total_ftg 的 AVG,然后获取该 AVG 并将其应用于每个团队。所以team_average 将是所有个人玩家平均值的总和。

我的尝试:

SELECT team,
(
        SELECT AVG(player_team_average) AS players_team_average
                 FROM
                 (
                   SELECT AVG(CASE WHEN f_team1='arsenal' OR f_team2='arsenal' THEN f_total_ftg END) AS team_average
                    FROM
                    (
                        SELECT f_player1 AS player, f_team1, f_team2, f_total_ftg FROM results
                        UNION
                        SELECT f_player2 AS player, f_team1, f_team2, f_total_ftg FROM results
                    ) x GROUP BY player
                 ) x
) AS team_average FROM (
    
    (SELECT f_team1 AS team, f_total_ftg FROM results)
    UNION
    (SELECT f_team2 AS team, f_total_ftg FROM results)
    ) x GROUP BY team

当前输出:

正如您从我的代码中看到的那样,我将球队设为arsenal,这给出了不同球员的正确总体平均水平。我怎样才能为每个团队做到这一点?我需要分出字符串并为每个团队应用平均值。

我该怎么做?

表格如下:

【问题讨论】:

您能否从表中添加更多示例数据并添加您的预期输出,谢谢! f_player1 是否属于f_team_1f_player2 是否属于f_team_2?如果是这样,并且如果同一名球员有时为一支球队效力,而其他时间为另一支球队效力,您是否希望在计算两支球队时都考虑球员的总体平均数,或者您是否希望计算该球员的球队相关平均数? 附带说明:平均值的平均值很少需要。例如:一个由非常弱的球员组成的球队,你多年来一直有成绩,可能已经给了一些超级球员以获得单一的利益表现。这不会对整体平均值产生太大影响,但会极大地影响玩家的平均值。 考虑修改你的数据模型 【参考方案1】:

这是你想要的吗?

select team, sum(avg_ftg) sum_avg_ftg
from (
    select team, player, avg(f_total_ftg) avg_ftg
    from (
        select f_team1 team, f_player1 player, f_total_ftg from mytable
        union all select f_team2, f_player2, f_total_ftg  from mytable
    ) t
    group by team, player
) t
group by team

这会将团队/玩家元组转为行,然后计算每个玩家和团队的平均 ftg,最后将每个团队的平均值相加。

在最新版本的 mysql 中,这可以通过横向连接更有效地表达:

select team, sum(avg_ftg) sum_avg_ftg
from (
    select x.team, x.player, avg(t.f_total_ftg) avg_ftg
    from mytable t
    cross join lateral (
        select t.f_team1 team, t.f_player1 player
        union all select t.f_team2, t.f_player2
    ) x
    group by x.team, x.player
) t
group by team

【讨论】:

对对对。我认为这是最优雅的解决方案。谢谢! 在您的工会中,您选择 f_team1 作为团队.. 这不会在分组中包含 f_team2,但最终的平均值会是这样吗? @arsenal88: team2 在union的其他成员中。

以上是关于嵌套分组mysql的主要内容,如果未能解决你的问题,请参考以下文章

Java学习总结(十六)——MySQL数据库(中)分组,嵌套,连接查询及外键与关系表设计

Mysql 聚合函数嵌套使用

oracle 分组函数里可以嵌套吗?

具有嵌套分组的 ExtJs 4 Grid

CSS进阶篇——分组和嵌套

CSS进阶篇——分组和嵌套