【问题标题】:MAX on columns generated by SUM and GROUP BYSUM 和 GROUP BY 生成的列上的 MAX
【发布时间】:2009-11-19 20:32:06
【问题描述】:

我试图在使用 SUM 语句动态生成的列上获取 MAX。 SUM 语句与 'GROUP by' 语法一起使用。

这是原始查询,但需要对其进行修改以使用分组、总和,当然还有 MAX。

SELECT  SUM(video_plays) AS total_video_plays
    FROM `video_statistics` v_stat
    GROUP BY v_stat.`video_id` ASC

如您所见,SUM 将 video_plays 内的所有值添加为 total_video_plays..

但我只是想获得 total_video_plays 的 MAX

我的尝试如下,但是它们不起作用..

SELECT SUM(video_plays) AS MAX(total_video_plays)
    FROM `video_statistics` v_stat
    GROUP BY v_stat.`video_id` ASC

不使用子查询如何动态获得列上的 MAX - 因为上述内容已经放在一个列中。

【问题讨论】:

    标签: sql mysql group-by sum max


    【解决方案1】:

    类似

    SELECT SUM(video_plays) AS total_video_plays
    FROM `video_statistics` v_stat
    GROUP BY v_stat.`video_id` 
    ORDER BY total_video_plays DESC 
    LIMIT 1 
    

    Hat Tip OMG Ponies 正确的 MySQL 方言。

    【讨论】:

    • 谢谢,因为我有问题的 SQL 嵌套了大约 5 次。我想我已经超越了“不良做法”的界限。这就是为什么我试图将潜艇保持在最低限度。这可以解决问题。再次感谢您!拉里。
    • 当结果中有多个最大值时,此查询在场景中失败
    • 为什么?用户没有询问最大视频播放次数存在的次数,只询问最大次数是多少,此查询将返回。
    • 我的借口。除非编辑答案,否则我无法删除我的反对票:/
    • @gkiko 你是对的,即使 OP 没有问他只想获得一个最大值,也很高兴知道。我遇到了这个问题,如果不仅有一个最大值并且我必须使用 Oracle 或 PostgreSQL 支持的“WITH”,我想要几行返回最大值。例如,MySQL 可以使用临时表。在我的情况下使用 WITH: WITH t AS (SELECT nomc, SUM(prix) sum_prix FROM circuit INNER JOIN reser ON circuit.nc = reser.nc GROUP BY nomc) SELECT nomc FROM t WHERE sum_prix = ( SELECT MAX(sum_prix) FROM t );
    【解决方案2】:

    如果没有子查询,您将无法执行您所要求的操作,因为您无法运行两个聚合函数,一个在另一个之上。

    【讨论】:

    • 它会对性能产生显着影响吗? Iv 读取子查询会阻塞您的资源 那么,我会使用子查询来做到这一点吗?
    • @Beavers:MySQL 上的子查询性能不佳,但并非所有数据库都如此。
    • MySQL 中的子查询到底有多糟糕?我的自然倾向(来自它们相当快的数据库)是使用子查询而不是 JOIN,如果它可以更好地表达查询的意图 - 我认为这在 MySQL 中没有完成?
    • 今天早些时候有一个问题使用了 0.4 秒的子查询 - 我建议取出 ORDER BY & LIMIT,这增加时间明显超过 60 秒。虽然不知道是什么版本。它就像游标——有时是必要的邪恶。
    • 我只是讨厌这样的想法,即子查询(SQL 的基本设计元素)已成为“必要的邪恶”,本质上是因为 MySQL 起初完全没有实现它们,后来又实现了正确的。
    【解决方案3】:

    这对你有用吗?

    SELECT MAX(total_video_plays) from table (
     SELECT SUM(video_plays) AS total_video_plays
        FROM `video_statistics` v_stat
        GROUP BY v_stat.`video_id` ASC )
    

    它包含一个子查询,但可能不是您想的那样。

    【讨论】:

    • 我认为这不会按原样工作 - 我只是将其作为 FROM (SELECT...`,但这是使用两个聚合函数来完成它的唯一方法。
    • 感谢您的尝试!欣赏它。
    【解决方案4】:

    这对我有用。

    select video_id, sum(video_plays) as sum_video_plays
    from (
        select video_id, video_plays
             , row_number() over (partition by video_id
                                  order by video_id desc) as rn
        from video_statistics
    ) as T
    where rn = 1
    group by video_id;
    

    【讨论】:

    • 谢谢。这就是我需要的。我的最终查询(以防该示例对其他人有帮助):select account_id, mnth max_month, my_count max_month_my_count from ( select account_id, left(date, 7) mnth, sum(my_count) my_count , row_number() over (partition by account_id order by sum(mt_count) desc) as rn from my_summary_table m left join my_other_table s on m.account_handle = s.account_handle where date >= '2021-01-01' and date < '2022-01-01' group by account_id, mnth) as T where rn = 1
    【解决方案5】:

    你不能这样做吗?:

    SELECT video_id, max(video_plays) AS max_video_plays    
    FROM `video_statistics` v_stat    
    GROUP BY v_stat.`video_id` ASC
    

    这里有一个例子:

    http://dev.mysql.com/doc/refman/5.1/de/select.html

    SELECT user, MAX(salary) FROM users
    GROUP BY user HAVING MAX(salary) > 10;
    

    EDIT:第二次尝试,尽管使用了子查询:

    select max(sum_video_plays)
    from (
    SELECT video_id, sum(video_plays) AS sum_video_plays    
    FROM `video_statistics` v_stat    
    GROUP BY v_stat.`video_id`
    ) x
    

    您的外部查询很可能是从更小的集合中选择的,并且(取决于您的数据分布等)可能非常高效。

    【讨论】:

    • 第一个查询会给你最高的单项,而不是最高的总和。
    • @Dave:不用担心,MySQL 的GROUP BY 可能会起作用,但令人沮丧的是,我所知道的任何其他数据库都不支持该语法。
    猜你喜欢
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    相关资源
    最近更新 更多