Suppose I have the following table in SQL:
id | year | value |
---|---|---|
1 | 2022 | 10 |
1 | 2020 | 5 |
2 | 2019 | 10 |
2 | 2021 | 4 |
3 | 2018 | 2 |
3 | 2017 | 10 |
And for each id, I want the last value based on the year. The final table would be:
id | year | value |
---|---|---|
1 | 2022 | 10 |
2 | 2021 | 4 |
3 | 2018 | 2 |
I know I have to use some sort of group by in id than order by year and get the first value, but I don’t know what aggregate function that would be.
My attempt was to group by id while ordering by year and then getting the first value:
SELECT id, MAX(year), FIRST(value)
FROM t
GROUP BY id
ORDER BY year desc
But this doesn’t work.
3
Answers
This is simple task for window functions:
online sql editor
Yet another option is using the
FETCH FIRST n ROWS WITH TIES
clause, which allows to get the first rows with respect an ordering. Applying the ordering using theROW_NUMBER
window function, will make you extract all rows with ranking = 1, tied.Check the demo here.
You can use a window function:
The first answer already gives the structure of the SQL making use of
row_number()
to filter the result. Here is an alternative: