snippetMinor
Oracle analytic functions - how to get the highest RANKing row?
Viewed 0 times
analyticthegethowrankingfunctionsoraclehighestrow
Problem
Test data:
See dbfiddle.
Problem:
Write a query that does all of the following:
{1} Find unique rows.
{2} Find the last 2 members (mbr) of each group (grp). Assumption: when the memb
create table test (
grp varchar2(16)
, mbr varchar2(16)
, reading1 number
, reading2 number
);
-- group A: 3 members, 1 duplicate set
-- group B: 2 members, 1 duplicate, one reading NULL
-- group C: 2 members, no repeats, no NULLs
begin
insert into test ( grp, mbr, reading1, reading2 )
values ( 'A', 'x', '1.0', '2.0' ) ;
insert into test ( grp, mbr, reading1, reading2 )
values ( 'A', 'y', '1.1', '2.2' ) ;
insert into test ( grp, mbr, reading1, reading2 )
values ( 'A', 'z', '1.2', '2.4' ) ;
insert into test ( grp, mbr, reading1, reading2 )
values ( 'A', 'x', '1.0', '2.0' ) ;
insert into test ( grp, mbr, reading1, reading2 )
values ( 'A', 'y', '1.1', '2.2' ) ;
insert into test ( grp, mbr, reading1, reading2 )
values ( 'A', 'z', '1.2', '2.4' ) ;
insert into test ( grp, mbr, reading1, reading2 )
values ( 'B', 'y', '20.2', null ) ;
insert into test ( grp, mbr, reading1, reading2 )
values ( 'B', 'x', '20.4', '40.4' ) ;
insert into test ( grp, mbr, reading1, reading2 )
values ( 'B', 'y', '20.2', null ) ;
insert into test ( grp, mbr, reading1, reading2 )
values ( 'B', 'x', '20.4', '40.4' ) ;
insert into test ( grp, mbr, reading1, reading2 )
values ( 'C', 'r', '100.1', '200.2' ) ;
insert into test ( grp, mbr, reading1, reading2 )
values ( 'C', 's', '100.2', '200.4' ) ;
end;
/See dbfiddle.
select * from test;
GRP MBR READING1 READING2
A x 1 2
A y 1.1 2.2
A z 1.2 2.4
A x 1 2
A y 1.1 2.2
A z 1.2 2.4
B y 20.2 NULL
B x 20.4 40.4
B y 20.2 NULL
B x 20.4 40.4
C r 100.1 200.2
C s 100.2 200.4Problem:
Write a query that does all of the following:
{1} Find unique rows.
{2} Find the last 2 members (mbr) of each group (grp). Assumption: when the memb
Solution
I fail to see the point of a requirements such as avoiding
When this is easier to read in my opinion:
WHERE rank_ =, but here it is, without RANK(), or hardcoding a constant (still, hardcoding is done by using FIRST_VALUE):select distinct grp,
first_value(result1) over (partition by grp order by mbr desc) as result1,
first_value(result2) over (partition by grp order by mbr desc) as result2
from (
select
grp, mbr,
reading1 - lag(reading2) over (partition by grp order by mbr) result1,
reading2 - lag(reading1) over (partition by grp order by mbr) result2
from (select unique grp, mbr,
nvl(reading1, 0) as reading1, nvl(reading2, 0) as reading2
from test)
);
GRP RESULT1 RESULT2
---------------- ---------- ----------
A -1 1.3
B -20.2 -20.4
C -100 100.3When this is easier to read in my opinion:
select grp, result1, result2 from (
select
grp,
reading1 - lag(reading2) over (partition by grp order by mbr) result1,
reading2 - lag(reading1) over (partition by grp order by mbr) result2,
rank() over (partition by grp order by mbr desc) as rank_
from (select unique grp, mbr,
nvl(reading1, 0) as reading1, nvl(reading2, 0) as reading2
from test)
) where rank_ = 1
;Code Snippets
select distinct grp,
first_value(result1) over (partition by grp order by mbr desc) as result1,
first_value(result2) over (partition by grp order by mbr desc) as result2
from (
select
grp, mbr,
reading1 - lag(reading2) over (partition by grp order by mbr) result1,
reading2 - lag(reading1) over (partition by grp order by mbr) result2
from (select unique grp, mbr,
nvl(reading1, 0) as reading1, nvl(reading2, 0) as reading2
from test)
);
GRP RESULT1 RESULT2
---------------- ---------- ----------
A -1 1.3
B -20.2 -20.4
C -100 100.3select grp, result1, result2 from (
select
grp,
reading1 - lag(reading2) over (partition by grp order by mbr) result1,
reading2 - lag(reading1) over (partition by grp order by mbr) result2,
rank() over (partition by grp order by mbr desc) as rank_
from (select unique grp, mbr,
nvl(reading1, 0) as reading1, nvl(reading2, 0) as reading2
from test)
) where rank_ = 1
;Context
StackExchange Database Administrators Q#199118, answer score: 3
Revisions (0)
No revisions yet.