Reputation: 3417
I'm using the following SQL to calculate the running total by date of a data processing function:
set @running_total := 0;
select date(event_date), (@running_total := @running_total + count(distinct de.iddocument)) AS cumulative_sum , count(distinct de.iddocument)
from document_event as de
left join document as d on d.iddocument = de.iddocument
where d.iddatastream = 142
and de.event_type = 'RESEARCHED'
and de.update_by_id is not null
group by date(event_date);
This SQL has been working perfectly for a year, however on the latest batch of data it no longer calculates the running total, it only displays each days total.
e.g. this is what it does on my older data:
+------------------+----------------+-------+
| date(event_date) | cumulative_sum | count |
+------------------+----------------+-------+
| 2015-11-09 | 167 | 167 |
| 2015-11-10 | 329 | 162 |
| 2015-11-11 | 775 | 446 |
| 2015-11-12 | 1151 | 376 |
| 2015-11-13 | 1680 | 529 |
| 2015-11-16 | 2266 | 586 |
| 2015-11-17 | 2837 | 571 |
| 2015-11-18 | 3590 | 753 |
| 2015-11-19 | 4162 | 572 |
+------------------+----------------+-------+
and this is what it does on my newest data:
+------------------+----------------+-------+
| date(event_date) | cumulative_sum | count |
+------------------+----------------+-------+
| 2016-04-20 | 6 | 6 |
| 2016-04-21 | 91 | 91 |
| 2016-04-22 | 151 | 151 |
| 2016-04-26 | 239 | 239 |
| 2016-04-27 | 203 | 203 |
| 2016-04-28 | 312 | 312 |
| 2016-04-29 | 374 | 374 |
| 2016-05-02 | 368 | 368 |
| 2016-05-03 | 226 | 226 |
+------------------+----------------+-------+
How is it possible that the running total is no longer being calculated?
Any ideas appreciated!
Upvotes: 2
Views: 26
Reputation: 1269873
Cumulative sums and aggregations sometimes don't mix. Try this:
select dte,
(@running_total := @running_total + cnt) AS cumulative_sum,
cnt
from (select date(event_date) as dte, count(distinct de.iddocument) as cnt
from document_event de left join
document d
on d.iddocument = de.iddocument
where d.iddatastream = 142 and
de.event_type = 'RESEARCHED' and
de.update_by_id is not null
group by date(event_date)
order by date(event_date)
) cross join
(select @running_total := 0) params;
Upvotes: 1