Получить последнюю запись в каждой группе и суммировать некоторые из них - PullRequest
0 голосов
/ 15 февраля 2011

У меня проблема с 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

чтобы запрос не суммировался, просто верните последнюю запись из группы помощь)

Ответы [ 3 ]

0 голосов
/ 15 февраля 2011

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

Редактировать; Я ошибаюсь, не нужно с 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;
0 голосов
/ 15 февраля 2011

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

В некоторых других БД вы можете использовать агрегатную функцию LAST. В 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.

0 голосов
/ 15 февраля 2011

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

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
...