代码之家  ›  专栏  ›  技术社区  ›  user3783243

双聚合函数Mysql

  •  0
  • user3783243  · 技术社区  · 6 年前

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

    :

    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
    

    Demo with my current try.

    仅ID 1 3 应该从样本数据返回,因为它们具有最高的累积 count 对于每个 section s。

    Here's a second SQL fiddle that demonstrates the same issue.

    2 回复  |  直到 6 年前
        1
  •  1
  •   Michał Turczyn    6 年前

    干得好:

    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
    
        2
  •  1
  •   Michał Turczyn    6 年前

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

    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

    DEMO

    Another demo ,您可以在其中比较我的查询和其他查询的性能。它包含约2万行,我的查询速度快了近2倍。