I have this table:
| user_id | name | modified_date | |
|---|---|---|---|
| 1 | John | a@gmail.com | 2022-01-01 |
| 1 | John | b@gmail.com | 2022-01-02 |
| 1 | Lucy | c@gmail.com | 2022-01-03 |
| 2 | Joey | d@gmail.com | 2021-12-24 |
| 3 | Mike | e@gmail.com | 2022-01-01 |
| 3 | Mary | f@gmail.com | 2022-01-02 |
I’m trying to get unique user_id‘s email with the most recent modified_date. This is my expected output:
| user_id | name | |
|---|---|---|
| 1 | c@gmail.com | Lucy |
| 2 | d@gmail.com | Joey |
| 3 | f@gmail.com | Mary |
I used limit 1, but the output seems to be randomized.
Can somebody help me to sort this out ?
Advertisement
Answer
you can go for row_number() with partition by
Schema (PostgreSQL v10.0)
create table users(user_id integer, name varchar(10), email varchar(20), modified_date timestamp); insert into users values (1 ,'John', 'a@gmail.com', '2022-01-01'), (1 ,'John', 'b@gamil.com', '2022-02-01');
Query #1
select user_id, email, name from ( SELECT user_id, name, email,row_number() over(partition by user_id order by modified_Date desc) as rnk FROM users ) as t where rnk = 1;
| user_id | name | |
|---|---|---|
| 1 | b@gamil.com | John |