In postgres, you can query for the first value of in a group with DISTINCT ON. How can this be achieved in Oracle?
From the postgres manual:
SELECT DISTINCT ON ( expression [, …] ) keeps only the first row of
each set of rows where the given expressions evaluate to equal. The
DISTINCT ON expressions are interpreted using the same rules as for
ORDER BY (see above). Note that the “first row” of each set is
unpredictable unless ORDER BY is used to ensure that the desired row
appears first.
For example, for a given table:
col1 | col2
------+------
A | AB
A | AD
A | BC
B | AN
B | BA
C | AC
C | CC
Ascending sort:
> select distinct on(col1) col1, col2 from tmp order by col1, col2 asc;
col1 | col2
------+------
A | AB
B | AN
C | AC
Descending sort:
> select distinct on(col1) col1, col2 from tmp order by col1, col2 desc;
col1 | col2
------+------
A | BC
B | BA
C | CC
The same effect can be replicated in Oracle either by using the
first_value()function or by using one of therank()orrow_number()functions.Both variants also work in Postgres.
first_value()first_valuegives the first value for the partition, but repeats it for each row, so it is necessary to use it in combination withdistinctto get a single row for each partition.row_number()/rank()Replacing
row_number()withrank()in this example yields the same result.A feature of this variant is that it can be used to fetch the first N rows for a given partition (e.g. “last 3 updated”) simply by changing
rownumber = 1torownumber <= N.