KayzerSoze
@KayzerSoze
Адекватен

Как сформировать запрос MySQL?

Есть одна таблица вида:

1 | Вася | 7 | 01.01.2018
2 | Вася | 2 | 02.02.2018
3 | Петя | 2 | 01.01.2018
4 | Вова | 1 | 01.01.2018

Мне нужно сгруппировать по имени, получить сумму и получить в отдельный столибик самую свежую дату.

Результат должен быть такой:
1 | Вася | 9 | 02.02.2018
2 | Петя | 2 | 01.01.2018
3 | Вова | 1 | 01.01.2018

Пока что я добрался только до группировки с суммированием. =)
Прошу помочь или направить в нужном направлении.
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ответы на вопрос 2
@alexalexes
Изучите для начала как использовать MAX(), SUM(), NUMBER() в mySQL.
Потом попробуйте эмулировать конструкции:
Max() over (partition by ... )
Sum() over (partition by ... )
Rank() over (partition by ... order by ... )
Ощутите всю "прелесть" mySQL по сравнению с MS SQL, Oracle и прочими СУБД, которые умеют эти конструкции.
select b.id, b.name, b.sum_value, b.max_date -- а в самом конечной выборке выбираем только первые номера нумерации строк от каждого человека
from ( select a.id, a.name, a.sum_value, a.max_date,  -- в этом подзапросе нумеруем строки в пределах одного человека
                      @rank := IF(@name2 != a.name, 1, @rank + 1) as rnk,
                      @name2 := a.name
              from (select t.id, t.name,  -- в этом подзапросе находим сумму очков и максимум даты
                          @sum := IF(@name != name, value, @sum + value) as sum_value,
                          @max := IF(@name != name, date, @max) as max_date,
                          @name := name
                  from   
                             (select 1 id, 'Вася' Name, 7 value, STR_TO_DATE('01.01.2018', '%d.%m.%Y') date union all
                              select 2 id, 'Вася' Name, 2 value, STR_TO_DATE('02.02.2018', '%d.%m.%Y') date union all
                              select 3 id, 'Петя' Name, 2 value, STR_TO_DATE('01.01.2018', '%d.%m.%Y') date union all
                               select 4 id, 'Вова' Name, 2 value, STR_TO_DATE('01.01.2018', '%d.%m.%Y') date ) t, --исходные данные в виде таблицы t
                             (select @max := 0, @sum := 0, @name := '') p
                  order by t.name, date desc
                 ) a,
                  (select @rank := 1, @name2 := '') p2
                  order by a.name, a.sum_value desc
) b where b.rnk = 1
order by b.id, b.name
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы