double聚合函数

zbsbpyhn  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(370)

我想从一系列返回值中取最大值,但我想不出一个简单的方法。我的查询返回所有行,所以1/2的方式。我可以用php过滤,但我想用sql来完成。我试过了 max 但仍返回所有结果的子查询。
ddl地址:

create table matrix(
   count int(4), 
   date date, 
   product int(4)
);
create table products(
   id int(4), 
   section int(4)
);

dml公司:

select max(magic_count), section, id
from (
    select sum(count) as magic_count, p.section, p.id
    from matrix as m
    join products as p on m.product = p.id
    group by m.product
) as faketable
group by id, section

演示我目前的尝试。
仅ID 1 以及 3 应该从样本数据返回,因为它们具有最高的累积 count 对于每个 section s。
下面是第二个sql fiddle,它演示了相同的问题。

z6psavjg

z6psavjg1#

这里有一个不用的解决方案 JOIN s、 它比另一个答案有更好的性能,后者使用了大量的数据 JOIN 学生:

select @rn := 1, @sectionLag := 0;

select id, section, count from (
    select id,
           case when @sectionLag = section then @rn := @rn + 1 else @rn := 1 end rn,
           @sectionLag := section,
           section, 
           count
    from (
        select id, section, sum(count) count
        from matrix m
        join products p on m.product = p.id
        group by id, section
    ) a order by section, count desc
) a where rn = 1

开头的变量用于模拟窗口函数( LAG 以及 ROW_NUMBER ),在MySQL8.0或更高版本中可用(如果您使用这样的版本,请让我知道,因此我将为您提供带有窗口函数的解决方案)。
演示
另一个演示,您可以在其中比较我的查询和其他查询的性能。它包含约2万行,我的查询速度快了近2倍。

pcrecxhr

pcrecxhr2#

干得好:

select a.id, 
       a.section,
       a.magic_count
from (
    select p.id,
           p.section,
           magic_count
    from (
        select m.product, sum(count) as magic_count
        from matrix m
        group by m.product
    ) sm
    join products p on sm.product = p.id
) a
left join (
    select p.id,
           p.section,
           magic_count
    from (
        select m.product, sum(count) as magic_count
        from matrix m
        group by m.product
    ) sm
    join products p on sm.product = p.id
) b on a.section = b.section and a.magic_count < b.magic_count
where b.id is null

请参阅手动输入中的简化示例(和其他方法),以获取包含某列的按组最大值的行
看它在这里工作

相关问题