Using ROW_NUMBER() analytic function you could achieve it. However, you will need to do it using a sub-query. But you could always look it different using WITH clause.
The below query would prompt you to enter the value for column a
, and return you the row with maximum value of column c
. The first part of the WITH clause is only to build sample data for demonstration, you only need the second part, i.e. t
.
For example,
Enter value for a
as 26
:
SQL> WITH data AS
2 (SELECT 26 AS a, 'R' AS b, 4 AS c FROM dual
3 UNION ALL
4 SELECT 26 AS a, 'T' AS b, 5 AS c FROM dual
5 UNION ALL
6 SELECT 26 AS a, 'S' AS b, 2 AS c FROM dual
7 UNION ALL
8 SELECT 25 AS a, 'Y' AS b, 2 AS c FROM dual
9 UNION ALL
10 SELECT 25 AS a, 'U' AS b, 3 AS c FROM dual
11 UNION ALL
12 SELECT 24 AS a, 'X' AS b, 3 AS c FROM dual
13 UNION ALL
14 SELECT 22 AS a, 'Z' AS b, 3 AS c FROM dual
15 UNION ALL
16 SELECT 21 AS a, 'P' AS b, 3 AS c FROM dual
17 ),
18 t AS
19 ( SELECT a,b,c,row_number() OVER(PARTITION BY a ORDER BY c DESC) rn FROM DATA
20 )
21 SELECT a,b,c FROM t WHERE a = &1 AND rn = 1;
Enter value for 1: 26
old 21: SELECT a,b,c FROM t WHERE a = &1 AND rn = 1
new 21: SELECT a,b,c FROM t WHERE a = 26 AND rn = 1
A B C
---------- - ----------
26 T 5
Enter value for a
as 25
:
SQL> WITH data AS
2 (SELECT 26 AS a, 'R' AS b, 4 AS c FROM dual
3 UNION ALL
4 SELECT 26 AS a, 'T' AS b, 5 AS c FROM dual
5 UNION ALL
6 SELECT 26 AS a, 'S' AS b, 2 AS c FROM dual
7 UNION ALL
8 SELECT 25 AS a, 'Y' AS b, 2 AS c FROM dual
9 UNION ALL
10 SELECT 25 AS a, 'U' AS b, 3 AS c FROM dual
11 UNION ALL
12 SELECT 24 AS a, 'X' AS b, 3 AS c FROM dual
13 UNION ALL
14 SELECT 22 AS a, 'Z' AS b, 3 AS c FROM dual
15 UNION ALL
16 SELECT 21 AS a, 'P' AS b, 3 AS c FROM dual
17 ),
18 t AS
19 ( SELECT a,b,c,row_number() OVER(PARTITION BY a ORDER BY c DESC) rn FROM DATA
20 )
21 SELECT a,b,c FROM t WHERE a = &1 AND rn = 1;
Enter value for 1: 25
old 21: SELECT a,b,c FROM t WHERE a = &1 AND rn = 1
new 21: SELECT a,b,c FROM t WHERE a = 25 AND rn = 1
A B C
---------- - ----------
25 U 3