2016-05-03 15 views
2

Arbeit verwende ich die folgende SQL die laufende Summe Datum einer Datenverarbeitungsfunktion zu berechnen:Mysql kumulative Summe nur manchmal

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); 

Diese SQL perfekt für ein Jahr gearbeitet haben, aber auf dem neuesten Stand Charge von Daten berechnet es nicht mehr die laufende Summe, es zeigt nur die Gesamtzahl der Tage an.

z.B. das ist, was es auf meinem älteren Daten hat:

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

und das ist, was es auf meinem neuesten Daten hat:

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

Wie ist es möglich, dass die laufende Summe nicht mehr berechnet werden?

Irgendwelche Ideen geschätzt!

Antwort

1

Kumulative Summen und Aggregationen mischen sich manchmal nicht. Versuchen Sie dies:

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; 
+0

Brilliant, das macht den Trick, sind Sie in der Lage zu erarbeiten, warum Ihr man arbeitet? – danspants

+0

@danspants. . . Ach, ich kann das nicht wirklich ausführen. Ich habe beobachtet, dass Variablen manchmal nicht an 'Group-by'-Abfragen arbeiten, weil die Reihenfolge der Auswertung des' select' nicht in der richtigen Reihenfolge ist. Die Materialisierung der 'Gruppe durch' in einer Unterabfrage behebt dieses Problem. –

Verwandte Themen