2017-02-02 2 views
4

Ich schreibe eine SQL-Abfrage, die eine Spalte gruppiert und Min-, Max- und Durchschnittswerte zurückgibt. Hier ist, was ich tue:Ermitteln eines falschen AVG() - Werts für die Spalte in SQL

CREATE TABLE Nums (
patient_id VARCHAR(20), 
val DOUBLE 
); 
INSERT INTO Nums 
VALUES ("A", 100), ("A", 175), ("B", 200), ("B", 100), ("B",20), ("B",2000), ("B",4000); 

select AVG(event_count), MIN(event_count), MAX(event_count) 
from Nums a 
join (select patient_id, count(*) as event_count from Nums group by patient_id) b 
on a.patient_id = b.patient_id; 

Ich erhalte die Ausgabe für die folgende Abfrage als

AVG(event_count) MIN(event_count) MAX(event_count) 
4.1429      2    5 

I richtigen Werte für min und max bekommen, aber ich erwartete den Durchschnittswert 3,5 bis sein . Ich bin mir nicht sicher, was ich falsch mache. Irgendwelche Hinweise darauf, was ich vermisse?

Danke.

+0

Was ist Ihre erwartete 'durchschnittliche_Count'? – Sadikhasan

+0

Es ist seltsam, dass eine Float-Spalte solche Werte enthalten würde – Strawberry

Antwort

5

Zum besseren Verständnis habe ich Ihre Tabellen hier visuell erstellt. Nums ein sieht aus wie

+ ---------- + ---- + 
| patient_id | val | 
+ ---------- + ---- + 
| A   | 100 | 
| A   | 175 | 
| B   | 200 | 
| B   | 100 | 
| B   | 20 | 
| B   | 2000 | 
| B   | 4000 | 
+ ---------- + ---- + 

Die Tabelle von Ihrem subselect, die Sie alias mit b wie

+ ------------------------- + 
| patient_id | event_count | 
+ ---------- + ------------ + 
| A   | 2   | 
| B   | 5   | 
+ ---------- + ------------ + 

sieht Wenn Sie innere ihnen angeschlossen und ausgewählt alle Spalten, würden Sie sehen,

+ ---------- + ---- + ------------ + 
| patient_id | val | event_count | 
+ ---------- + ---- + ------------ + 
| A   | 100 | 2   | 
| A   | 175 | 2   | 
| B   | 200 | 5   | 
| B   | 100 | 5   | 
| B   | 20 | 5   | 
| B   | 2000 | 5   | 
| B   | 4000 | 5   | 
+ ---------- + ---- + ------------ + 

Wenn Sie durchschnittlich, machen Sie 29/7 = 4.1429.

Es scheint mir, wie Sie nur die Nummern 2 und 5 bis durchschnittlich wollen, die Ihre subselect Tisch ist, so würde ich etwas tun, wie

select AVG(event_count), MIN(event_count), MAX(event_count) 
    from (
     select patient_id, count(*) as event_count 
      from Nums 
      group by patient_id 
     ) 
+0

Das hat funktioniert. Danke für Ihre ausführliche Erklärung. – Tontodoin

0
select AVG(event_sum), MIN(event_count), MAX(event_count) 
from Nums a 
join (select patient_id, count(*) as event_count,sum(val) as event_sum from Nums group by patient_id) b 
on a.patient_id = b.patient_id; 
1

Versuchen Sie, diese

SELECT AVG(event_count),MIN(event_count), MAX(event_count) 
FROM(
    SELECT patient_id, count(*) as event_count 
    FROM Nums GROUP BY patient_id 
)M 
+0

Danke, das funktioniert! – Tontodoin

0

Ja, Bitte verwenden Sie diese Abfrage Ich denke, Sie erhalten Ihr erwartetes Ergebnis

select AVG(DISTINCT event_count), MIN(event_count), MAX(event_count) 
from Numstest a 
join (select patient_id, count(*) as event_count from Numstest group by patient_id) b 
on a.patient_id = b.patient_id; 
Verwandte Themen