I am trying to write a query which will return only the rows, which time has the greatest value for each id
Table: positions id time otherCols... ---------- ----------- ---------- 1 1 1 2 3 1 1 3 2 1 3 2
Result should look like:
id time otherCols... ---------- ----------- ---------- 1 3 2 1 3 2
I tried grouping by id but I don’t know how to sort after that and pick only the top result.
Advertisement
Answer
You can use window functions:
select t.*
from (select t.*,
row_number() over (partition by id order by time desc) as seqnum
from t
) t
where seqnum = 1;
An alternative method is a correlated subquery:
select t.* from t where t.time = (select max(t2.time) from t t2 where t2.id = t.id);
This is different from the first query in two respects:
- If there are duplicate times for an
id, then this returns all rows for anid. You can get that behavior usingrank()in the first query. - This will not return
NULLidvalues orids where thetimeis uniformlyNULL. The first query does.