2017-11-07 1 views
1

ich einen Datensatz haben, die wie folgtSQL - Summenwerte mit demselben Datum, für jedes Datum

Enc_ID | date | P1 | P3 | 
-------------------------------- 
1  | 11/1/17 | 1 | NULL | 
2  | 11/1/17 | NULL | 1 | 
3  | 11/1/17 | 1 | NULL | 
4  | 11/2/17 | 1 | NULL | 
5  | 11/2/17 | NULL | 1 | 

sieht also jede Zeile ist eine Begegnung, und es sein kann (immer) mehrere Begegnungen an einem bestimmten Tag .

Ich muss eine laufende Summe von P1 und P3 für jeden Tag berechnen. Also:

date | sum_p1 | sum_p3 | 
--------------------------- 
11/1/17 | 2 | 1 | 
11/2/17 | 3 | 2 | 

Dann brauche ich für jede dieser Summen diese Berechnung auszuführen, für jeden Tag wie folgt aus:

(sum_p1 - sum_p3)/sum_p1 

Also muss ich schließlich eine Tabelle, die

date | dropout rate 
---------------------- 
11/1/17 | 50% 
11/2/17 | 33% 

zeigen würde, Ich versuche dies in Superset zu tun, also kann ich keine JOINS verwenden. Ich habe eine Art verschachtelt GROUP BY versucht, aber MySQL (5.7.20) mag es nicht.

Dies ist meine aktuelle Abfrage, aber es gibt nur die SUM von p1 und p3 für jedes Datum, nicht AS von jedem Datum.

SELECT encounter_date AS __timestamp, 
     (SUM(p1) - SUM(p3))/SUM(p1) AS pd 
FROM encounter 
WHERE encounter_date >= '2016-11-06 00:00:00.000000' 
    AND encounter_date <= '2017-11-06 17:00:29.000000' 
GROUP BY encounter_date 
ORDER BY encounter_date ASC 
LIMIT 50000 
OFFSET 0 
+0

Ist es MySQL oder Postgresql? –

+0

danke @Gordon für die Formatierung Hilfe :) –

+0

@ClodoaldoNETo derzeit arbeite ich in MySQL, aber ich glaube, wir wechseln bald nach Postgres, so habe ich mit beiden markiert –

Antwort

0

Verwenden Sie in MySQL Variablen oder Unterabfragen. Variablen ist einfacher in diesem Fall:

select encounter_date, p1, p3, 
     (@p1 := @p1 + p1) as running_p1, 
     (@p3 := @p3 + p3) as running_p3 
from (select encounter_date, count(p1) as p1, count(p3) as p3 
     from encounter e 
     where encounter_date >= '2016-11-06 00:00:00.000000' and encounter_date <= '2017-11-06 17:00:29.000000' 
     group by encounter_date 
     order by encounter_date 
    ) e cross join 
    (select @p1 := 0, @p3 := 0) params; 

Für Ihre endgültige Berechnung, verwenden Sie diese als Unterabfrage die endgültige Berechnung zu tun.

+0

Können Sie erklären, was Sie meinen mit "Für Ihre endgültige Berechnung verwenden dies als Unterabfrage für die endgültige Berechnung. "? (Ich bin brandneu zu SQL) danke :) –

+0

@ClayCrosby. . . Sie sollten lernen, welche Unterabfragen/abgeleiteten Tabellen sind. –

+0

Hat eine schnelle Bearbeitung der zweiten und dritten Zeile gemacht, aber das hat funktioniert. Danke @Gordon !! –

0

Ich würde es tun, der Reihe nach mit 2 verbunden Anfragen:

SELECT encounter_date as `date`, (1-`sum_p3`/`sum_p1`) as `dropout rate` FROM (
SELECT encounter_date, SUM(p1) as `sum_p1`, SUM(p3) as `sum_p3` 
FROM encounter 
WHERE encounter_date >= '2016-11-06 00:00:00.000000' 
    AND encounter_date <= '2017-11-06 17:00:29.000000' 
GROUP BY encounter_date 
ORDER BY encounter_date ASC 
) as `grouped` 
+0

Dies gibt immer noch die Werte ** für ** jeden Tag und nicht ** für ** jeden Tag zurück –