Home >Database >Mysql Tutorial >How to Efficiently Retrieve Values Associated with Maximum Column Values Within Groups in Oracle SQL?
Oracle SQL: Extracting Values Linked to Maximum Column Values within Groups
A common database task involves selecting values associated with the maximum value of a column, especially when dealing with grouped data. Let's consider a table with columns KEY
, NUM
, and VAL
:
KEY | NUM | VAL |
---|---|---|
A | 1 | AB |
B | 1 | CD |
B | 2 | EF |
C | 2 | GH |
C | 3 | HI |
D | 1 | JK |
D | 3 | LM |
The objective is to find the maximum NUM
for each KEY
and its corresponding VAL
. The desired output:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
One method uses a subquery:
<code class="language-sql">select KEY, VAL from TABLE_NAME TN where NUM = ( select max(NUM) from TABLE_NAME TMP where TMP.KEY = TN.KEY );</code>
However, a more efficient and readable approach employs the ROW_NUMBER()
function:
<code class="language-sql">select key, val from (select t.*, row_number() over (partition by key order by num desc) as seqnum from table_name t ) t where seqnum = 1;</code>
This assigns a rank within each KEY
group based on descending NUM
values. The WHERE
clause then filters for the top rank (seqnum = 1
), yielding the desired result:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
While both methods achieve the same outcome, the ROW_NUMBER()
approach generally provides better performance and clarity, particularly with larger datasets. The optimal choice depends on specific needs and preferences, but ROW_NUMBER()
offers a robust and elegant solution for this common SQL problem.
The above is the detailed content of How to Efficiently Retrieve Values Associated with Maximum Column Values Within Groups in Oracle SQL?. For more information, please follow other related articles on the PHP Chinese website!