/ / Aggregatfunktion funktioniert nicht wie erwartet - sql, oracle

Aggregatfunktion funktioniert nicht wie erwartet - sql, oracle

Ich habe gerade eine Abfrage geschrieben, um den Median aus einer Tabelle herauszufinden. Die Tabelle hatte eine einzelne Spalte mit aufeinanderfolgenden natürlichen Zahlen von 1 bis 106.

CREATE TABLE med
AS (SELECT rs
FROM ( SELECT rownum rs
FROM employees
WHERE employee_id<=106));

Ich habe die Abfrage erfolgreich ausgeführt, um den Mittelwert dieser 106 natürlichen Zahlen als 53,5 zu finden

SELECT AVG(median)
FROM (
SELECT a.rs median
FROM med a,
med b
GROUP BY a.rs
HAVING  SUM(CASE
WHEN b.rs<=a.rs THEN 1
ELSE 0
END)>=(COUNT(*)/2)
AND     SUM(CASE
WHEN b.rs>=a.rs THEN 1
ELSE 0
END)>=(COUNT(*)/2));

Wenn Sie jedoch die Aggregatfunktion AVG verwenden, ohne die Unterabfrage wie folgt zu verwenden:

SELECT AVG(a.rs) median
FROM med a,
med b
GROUP BY a.rs
HAVING  SUM(CASE
WHEN b.rs<=a.rs THEN 1
ELSE 0
END)>=(COUNT(*)/2)
AND     SUM(CASE
WHEN b.rs>=a.rs THEN 1
ELSE 0
END)>=(COUNT(*)/2)

dann gibt es nicht die erwartete Ausgabe als 53.5 an, sondern gibt die Ausgabe als 53, 54 aus. Warum so?

Antworten:

0 für die Antwort № 1

Das liegt daran, dass Sie bei Ihrer ersten Abfrage mit Unterabfrage den Durchschnitt zwischen den Werten 53 und 54 berechnen.

Bei Ihrer zweiten Abfrage ohne Unterabfrage wird die Aggregationsfunktion ausgeführt, jedoch getrennt für jeden Wert, dh AVG (53) und AVG (54). Deshalb bekommen Sie 2 Reihen zurück.

Ich hoffe es ist dir klar.