secondmax
How do I retrieve the second highest salary of emp?
There is no right or wrong treatment of duplicates, there are only buggy specifications…
There are plenty of ways to do this.
An Oracle 7 approach would be
SELECT MAX(SAL)
FROM EMP, (
SELECT MAX(SAL) MAXSAL FROM EMP)
WHERE SAL<MAXSAL;
Using TOP-n queries I could use
SELECT SAL
FROM (
SELECT ROWNUM R,SAL FROM (
SELECT SAL FROM EMP ORDER BY SAL DESC))
WHERE R=2;
Using ROW_NUMBER (or RANK or DENSE_RANK), I could use
SELECT SAL
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY SAL DESC) R,SAL FROM EMP)
WHERE R=2;
Another approach would be to create a SecondMax aggregate function, as the following example from the doc
Example 11-12 How to Create and Use a User-Defined Aggregate Function
SELECT SecondMax(sal)
FROM emp;
Ok, if I know I have 14 employees in EMP, retrieving the second highest is way easier
SELECT PERCENTILE_DISC(2/14) WITHIN GROUP (ORDER BY SAL DESC)
FROM EMP;
I would not use RANK()..
My funny solution
select RTrim(Ltrim(RegExp_Substr(XMLAgg(XMLElement(“dummy”,SAL) order by SAL desc),’>[^’),’
Oh I post again.
I have used code-tag.
My funny solution
[code]
select RTrim(Ltrim(RegExp_Substr(XMLAgg(XMLElement("dummy",SAL) order by SAL desc),'>[^'),'
Oh, code-tag of my post was disable.
But I think that Laurent Schneider can understand my solution.
I got hint from this article which used group_concat of MySQL.
http://www.onlamp.com/pub/a/mysql/2007/03/29/emulating-analytic-aka-ranking-functions-with-mysql.html?page=4
no, I do not see your query but I could imagine something like
Ok, let’s do it with XMLish functions
select extractvalue(XMLAgg(XMLElement(SAL,SAL) order by SAL desc),’/SAL[2]‘) FROM EMP;
EXTRACTVALUE(XMLAGG(XMLELEMENT(SAL,SAL)ORDERBYSALDESC),’/SAL[2]‘)
——————————————————————————–
3000
One more try to show what I learnt from Marco
select extractvalue(XMLAgg(XMLElement(SAL,SAL) order by SAL desc),’//SAL[2]/text()’) SAL FROM EMP
SAL
—-
3000
Wow!!
greate solution.
I did not realize to use extractValue.
I will study XML.
In my old posts, my usage of code-tag was wrong.
My solution was below.
SAL
—-
3000
me too, but XML is huge!!! good luck
Since 11gR2,
We can use nth_Value
http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/functions112.htm
select distinct
NTH_VALUE(sal,2)
over(order by sal desc Rows between Unbounded Preceding
and Unbounded Following)
from EMP;
sure, I thought about this too
I regret that nth value has no aggregate form. Distinct+analytic is a bit ugly…