Reputation: 13
How to get only the first records from each day?
id | name | date
1 | aaa | 2018-05-10
2 | bbb | 2018-05-10
3 | ccc | 2018-05-10
4 | ddd | 2018-05-11
5 | eee | 2018-05-11
6 | fff | 2018-05-13
I would like to receive:
1 | aaa | 2018-05-10
4 | ddd | 2018-05-11
6 | fff | 2018-05-13
Upvotes: 1
Views: 153
Reputation:
For Postgres there is a more efficient solution:
select distinct on (id) id, name, date
from the_table
order by id, date;
Upvotes: 1
Reputation: 46219
If ID is Pk,this query can work on PostgreSQL and MySql
Writing subquery to get MIN
id by date
in the table,then self join
SELECT t1.*
FROM (
SELECT MIN(ID) minId
FROM T1
GROUP BY date
) t inner join t1 on t.minid = t1.id
sqlfiddle:http://sqlfiddle.com/#!9/9a48d7/4
Upvotes: 0
Reputation: 887
CREATE TABLE T1
(id int, name varchar2(3), dat timestamp)
;
INSERT ALL
INTO T1 (id, name, dat)
VALUES (1, 'aaa', '10-May-2018 12:00:00 AM')
INTO T1 (id, name, dat)
VALUES (2, 'bbb', '10-May-2018 12:00:00 AM')
INTO T1 (id, name, dat)
VALUES (3, 'ccc', '10-May-2018 12:00:00 AM')
INTO T1 (id, name, dat)
VALUES (4, 'ddd', '11-May-2018 12:00:00 AM')
INTO T1 (id, name, dat)
VALUES (5, 'eee', '11-May-2018 12:00:00 AM')
INTO T1 (id, name, dat)
VALUES (6, 'fff', '13-May-2018 12:00:00 AM')
SELECT * FROM dual
;
Query -
select id, name, dat from (
select id, name, dat, dense_rank() over (partition by dat order by id) as rnk
from t1
) where rnk = 1;
ID NAME DAT
1 aaa 2018-05-10 00:00:00.0
4 ddd 2018-05-11 00:00:00.0
6 fff 2018-05-13 00:00:00.0
Upvotes: 0