Получите последнюю запись в каждой группе и СУММУЛИРУЙТЕ некоторые из них

у меня проблема с sql-запросом к mysql, чтобы взять последнюю запись в каждой группе и суммировать некоторые поля в одном запросе. У меня есть таблица:

name        date    interested  made_call
andrew.h    2011-02-04      10        10
andrew.h    2011-02-11      20        10
andrew.h    2011-02-13      2         10
sasha.g  2011-02-11      5         20
sasha.g  2011-02-12      5         1

мне нужно просуммировать группировку столбцов made_call по имени и вернуть последнюю запись из заинтересованного. вот что я хочу получить в результате:

name        date    interested  made_call
andrew.h    2011-02-13      2         30
sasha.g  2011-02-12      5         21

я пытался получить результат с этим запросом

SELECT a.name,a.date,a.interested,sum(made_call) as made_call
FROM `resultboard` a 
WHERE a.attendence = 1 
AND NOT EXISTS (select 1 from resultboard where name = a.name
       and id > a.id and attendence = 1)
GROUP BY name

но в результате я получил

  andrew.h  2011-02-13      2         10
  sasha.g    2011-02-12      5         1

поэтому запрос не суммировался, просто возвращал последнюю запись из групповой справки)


person Jeremy    schedule 15.02.2011    source источник


Ответы (3)


Это может быть немного медленно, если таблица очень большая, но это даст желаемый результат:

SELECT a.name, t.date, a.interested, t.calls
FROM resultboard a 
JOIN (SELECT name, MAX(date) AS date, SUM(made_call) AS calls FROM resultboard 
     GROUP BY name) AS t
     ON a.name = t.name AND a.date = t.date
person Galz    schedule 15.02.2011

Ваше предложение WHERE исключает из рассмотрения всю строку, кроме последней, как часть суммы.

В некоторых других БД вы можете использовать агрегатную функцию ПОСЛЕДНЯЯ. В MySQL этого нет, но вы можете эмулируйте это так для вашего случая:

SELECT
    a.name,
    SUBSTRING_INDEX(
      GROUP_CONCAT(CAST(a.date AS CHAR) ORDER BY date desc),
      ',', 1
    ) AS date,
    SUBSTRING_INDEX(
      GROUP_CONCAT(CAST(a.interested AS CHAR) ORDER BY date desc),
      ',', 1
    ) AS interested,
    sum(made_call) as made_call
FROM `resultboard` a 
WHERE a.attendence = 1 
GROUP BY name

Это может быть не быстро на больших наборах данных, но, по крайней мере, должно работать, если мои исследования верны. Я не проверял это, так что YMMV.

person Walter Mundt    schedule 15.02.2011

Я думаю, что использование модификатора WITH ROLLUP для GROUP BY может вам помочь. http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html

Редактировать; Я ошибся, нет необходимости в WITH ROLLUP

SELECT r.name,  
       MAX(r.date) as date,  
       (SELECT r2.interested FROM resultboard r2 WHERE r2.name = r.name ORDER BY r.date DESC LIMIT 1),  
       SUM(made_call) as made_call  
FROM resultboard r 
GROUP BY name;
person Yasen Zhelev    schedule 15.02.2011