/ / La funzione di aggregazione non funziona come previsto - sql, oracle

La funzione di aggregazione non funziona come previsto - sql, oracle

Stavo scrivendo una query per trovare la mediana da un tavolo. Il tavolo aveva una singola colonna comprendente numeri naturali consecutivi da 1 a 106.

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

Ho eseguito correttamente la query per trovare la mediana di questi 106 numeri naturali come 53.5

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

Ma sull'utilizzo della funzione di aggregazione AVG senza utilizzare la sottoquery come questa:

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)

quindi non dà l'output atteso come 53.5, piuttosto dà l'output come 53, 54. perché così?

risposte:

0 per risposta № 1

Questo perché nella tua prima query con sottoquery, stai calcolando la media tra i valori 53 e 54.

Nella seconda query senza subquery viene eseguita la funzione di aggregazione, ma viene eseguita su ciascun valore separatamente, ovvero AVG (53) e AVG (54). Ecco perché stai recuperando 2 righe.

Spero sia chiaro per te.