Конечная сумма запроса - PullRequest
2 голосов
/ 01 марта 2011

Я ищу итоговую дату и мне нужно найти способ сделать 3-дневную трейлинг-сумму, сумму текущей даты и 2 предыдущих дня.Я использую MariaDB, форк MYSQL.

Вот подмножество данных;

select Date, Total from keywordSum limit 5;
+------------+--------+
| Date       | Total  |
+------------+--------+
| 2010-11-11 | 316815 |
| 2010-11-12 | 735305 |
| 2010-11-13 | 705116 |
| 2010-11-14 | 725020 |
| 2010-11-15 | 745378 |
+------------+--------+

Я бы хотел получить такой результат:

+------------+--------+-----------+
| Date       | Total  | 3DayTotal |
+------------+--------+-----------+
| 2010-11-11 | 316815 |    316815 |
| 2010-11-12 | 735305 |   1052120 |
| 2010-11-13 | 705116 |   1757236 |
| 2010-11-14 | 725020 |   2167441 |
| 2010-11-15 | 745378 |   2177514 |
+------------+--------+-----------+

Он может даже напечатать NaN или оставить его пустым, если предыдущие дни не существуют.Любые мысли или предложения будут с благодарностью.

Ответы [ 2 ]

3 голосов
/ 01 марта 2011

Один простой способ - присоединить стол к себе.Удостоверьтесь, что это проиндексировано на комбинации даты и итога.

select t1.date
     , t1.total
     , t1.total 
      +coalesce(t2.total,0)
      +coalesce(t3.total,0)
  from theTable t1
  left 
  join theTable t2 on t1.date = date_Add(t2.date,interval 1 day)
  left
  join theTable t3 on t1.date = date_Add(t3.date,interval 2 day)
2 голосов
/ 02 марта 2011

Быстрый способ с использованием переменных MySQL

Пример таблицы:

create table keywordsum (date datetime, total int);
insert keywordsum values
('2010-11-11',316815),
('2010-11-12',735305),
('2010-11-13',705116),
('2010-11-14',725020),
('2010-11-15',745378);

Запрос:

select
  k.date, k.total, k.total + ifnull(@d1,0) + ifnull(@d2,0) running_total,
  @d2 := @d1,
  @d1 := k.total
from (select @d1 := null, @d2 := null) vars
cross join keywordsum k
order by k.date

(Вы всегда можете выбрать это, чтобы получить только первые 3столбцы)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...