Reputation: 1428
This seems something simple, but couldn't find an answer for this question last few hours.
I have a table request_state, where "id" is primary key, it can have multiple entries with same state_id. I want to get the id after grouping by state_id using max datetime.
So I tried this, but it gives error "state_id" must appear in the GROUP BY clause or be used in an aggregate function
select id, state_id, max(datetime)
from request_state
group by id
but when I use following query, I get multiple entries with same state_id.
select id, state_id, max(datetime)
from request_state
group by id, state_id
My table:
id state_id date_time cef 1 Jan 1
ter 1 Jan 2
ijk 1 Jan 3
uuu 2 Feb 1
rrr 2 Feb 2
This is what I want as my result,
id state_id date_time
__ ________ _________
ijk 1 Jan 3
rrr 2 Feb 2
Upvotes: 2
Views: 1480
Reputation: 50163
You can use correlated suqbuery
:
select t.*
from table t
where date_time = (select max(date_time) from table t1 where t1.state_id = t.state_id);
Upvotes: 1
Reputation: 37337
Try this query:
select id, state_id, date_time from (
select id, state_id, date_time,
row_number() over (partition by state_id order by date_time desc) rn
from tbl
) a where rn = 1
Upvotes: 1
Reputation: 1269453
You seem to want:
select max(id) as id, state_id, max(datetime)
from request_state
group by state_id;
If you want the row where datetime
is maximum for each state, then use distinct on
:
select distinct on (state) rs.*
from request_state rs
order by state, datetime desc;
Upvotes: 1