Правильная группировка данных в mysql

Здравствуйте.
Возникла сложность при группировке результатов запроса.
запрос - SELECT DATE_FORMAT(FROM_UNIXTIME(`create_date`), "%Y-%m-%d") AS `day`, SUM(sum) as sum, balance, IF(sum>0, "plus", "minus") AS znak FROM `tbl_finance` `t` WHERE user_id = '3' GROUP BY day, znak ORDER BY id DESC LIMIT 50
его результат http://pix.am/ojmT/
исходные данные http://pix.am/k5j0/
запрос работает почти корректно, группирует как надо, но вот поле "balance" отображает не верно. если есть в одном дне более одной строки с одинаковым знаком - "+" или "-" то он получаем первое значение баланса и выводит в результат, а мне же надо выводить последнее значение баланса.
Необходимо получать последнее значение баланса. Пробовал варианты с "Max(balance), Min(balance), SUM(balance)" но это лишь в каких-то случаях отображает верный результат, но не во всех случаях.
Что делает запрос ? - отображаем информацию по пополнениям и списаниям пользователю, сгруппированную по дням и по операциям(списание и пополнение).

1 ответов


То, что вы хотите, это не групповая операция, а аналитическая. Вот почему Oracle рулит. В mysql это сделать сложнее, с подзапросом:


SELECT DATE_FORMAT(FROM_UNIXTIME(`create_date`), "%Y-%m-%d") AS `day`,
  SUM(sum) as sum,
  (select balance from `tbl_finance` `tb` where DATE_FORMAT(FROM_UNIXTIME(t.create_date), "%Y-%m-%d") = DATE_FORMAT(FROM_UNIXTIME(tb.create_date), "%Y-%m-%d") and IF(t.sum>0, "plus", "minus") = IF(tb.sum>0, "plus", "minus") order by create_date desc limit 1) as balance,
  IF(sum>0, "plus", "minus") AS znak
FROM `tbl_finance` `t`
WHERE user_id = '3'
GROUP BY day, znak
ORDER BY id DESC LIMIT 50
 

Или отсортируйте tbl_finance по create_date desc перед выполнением вашего запроса. Может поможет, но результат не 100%.