Efficiently obtain data based on the maximum value of the relevant column
In scenarios where you need to retrieve a specific column value based on the maximum value of the related column and grouped by a third column, SQL provides an optimized solution. Consider the following table, which contains data for KEY, NUM, and VAL columns:
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 goal is to retrieve the following results from this data:
KEY | VAL |
---|---|
A | AB |
B | EF |
C | HI |
D | LM |
While the query provided in the question achieves this result, there is a more elegant way using row_number()
:
<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 query efficiently partitions rows based on the KEY column and assigns row numbers in descending order seqnum
within each partition. By selecting rows where seqnum
is equal to 1, we obtain the desired result and retain the desired grouping.
It's worth noting that this method differs slightly from the original query in that it always returns one row per key, whereas the original query may return multiple rows. If this behavior is desired, rank()
or dense_rank()
can be used instead of row_number()
.
The above is the detailed content of How Can I Efficiently Retrieve Values Based on the Maximum of a Related Column in SQL?. For more information, please follow other related articles on the PHP Chinese website!