Двойная агрегатная функция Mysql - PullRequest
0 голосов
/ 31 августа 2018

Я хочу взять максимальное значение из серии возвращаемых значений, но я не могу найти простой способ сделать это. Мой запрос возвращает все строки, так что 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

Демонстрация с моей текущей попыткой.

Из данных выборки должны быть возвращены только идентификаторы 1 и 3, поскольку они имеют наибольшее совокупное значение count для каждого из section s.

Вот вторая скрипта SQL, которая демонстрирует ту же проблему.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Здесь у вас есть решение без использования JOIN s, оно имеет лучшую производительность, чем другой ответ, который использует много 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), которые доступны в MySQL 8.0 или выше (если вы используете такую ​​версию, дайте мне знать, поэтому я предоставлю вам решение также с оконными функциями).

DEMO

Еще одна демонстрация , где вы можете сравнить производительность моего и другого запроса. Он содержит ~ 20 тыс. Строк, и мой запрос имеет тенденцию быть почти в 2 раза быстрее.

0 голосов
/ 04 сентября 2018

Вот, пожалуйста:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...