Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Mailing Lists -> Oracle-L -> Calculating The Median: Error Discovered in Oracle SQL 101 Code
I ran the code from Oracle SQL 101 which Jared posted modifying it to find the median of the sal column on that table
SQL> select
2 rownum,
3 sal
4 from (
5 select sal
6 from scott.emp
7 where sal is not null
8 union
9 select 1 from dual where 1=2
10 )
11 group by sal, rownum
12 having rownum >= (
13 select decode( mod(total_freq,2),
14 1,trunc(total_freq/2 + 1),
15 0,trunc(total_freq/2)
16 )
17 from (
18 select count(*) total_freq
19 from scott.emp
20 where sal is not null
21 )
22 )
23 and rownum <= (
24 select decode( mod(total_freq,2),
25 1,trunc(total_freq/2 + 1),
26 0,trunc(total_freq/2 + 1)
27 )
28 from (
29 select count(*) total_freq
30 from scott.emp
31 where sal is not null
32 )
33 )
34 /
values averaged
7 1600 8 2450 ---------- Median 2025This answer is different from the result of the code I posted which uses the new analytical functions.
--------------------------------------------------------------------------------------
select
case
when mod(number_salaried,2) = 0 then (select sum(sal)/2 from(select sal, row_number() over ( order by sal) as salrank from scott.emp) where salrank = number_salaried/2 or salrank = number_salaried/2 +1) else (select sal from(select sal, row_number() over ( order by sal) as salrank from scott.emp) where salrank = ceil(number_salaried/2))end median
MEDIAN
1550
clear computes
utes cleared
select
rownum,
sal
from (
select sal
from scott.emp
where sal is not null
union
select 1 from dual where 1=2
)
group by sal, rownum
/
ROWNUM SAL
------ ----------
1 800 2 950 3 1100 4 1250 5 1300 6 1500 7 1600 8 2450 9 2850 10 2975 11 3000 ROWNUM SAL ------ ---------- 12 5000
and also ran the part of my code which corresponded. I changed my code slightly so the salrank column would print.
SQL> select salrank, sal from(select sal, row_number()
2 over ( order by sal) as salrank 3 from scott.emp)
SALRANK SAL
---------- ----------
1 800 2 950 3 1100 4 1250 5 1250 6 1300 7 1500 8 1600 9 2450 10 2850 11 2975 SALRANK SAL
---------- ----------
12 3000 13 3000 14 5000
14 rows selected.
I hope there was a caveat in SQL 101 book stating the code only worked against columns with unique values, not including nulls.
Ian MacGregor
Stanford Linear Accelerator Center
ian_at_slac.stanford.edu
-- Please see the official ORACLE-L FAQ: http://www.orafaq.com -- Author: MacGregor, Ian A. INET: ian_at_SLAC.Stanford.EDU Fat City Network Services -- (858) 538-5051 FAX: (858) 538-5051 San Diego, California -- Public Internet access / Mailing ListsReceived on Sat Jun 30 2001 - 20:04:51 CDT
--------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message to: ListGuru_at_fatcity.com (note EXACT spelling of 'ListGuru') and in the message BODY, include a line containing: UNSUB ORACLE-L (or the name of mailing list you want to be removed from). You may also send the HELP command for other information (like subscribing).
![]() |
![]() |