There is a set of data, like
| id | serial | version | is_deleted | -------------------------------------------------- | 10 | AAAAAA | 2019-04-14 15:28:08 | 0 | | 22 | AAAAAA | 2019-03-04 15:28:08 | 0 | | 13 | AAAAAA | 2019-02-10 15:28:08 | 0 | | 40 | BBBBBB | 2019-04-17 15:28:08 | 0 | | 27 | BBBBBB | 2019-02-20 15:28:08 | 0 | | 17 | CCCCCC | 2019-03-04 15:28:08 | 0 | | 35 | CCCCCC | 2019-01-01 15:28:08 | 0 |
I want to mark all older entries in each group as deleted and to have following data as result
| id | serial | version | is_deleted | -------------------------------------------------- | 10 | AAAAAA | 2019-04-14 15:28:08 | 0 | | 22 | AAAAAA | 2019-03-04 15:28:08 | 1 | | 13 | AAAAAA | 2019-02-10 15:28:08 | 1 | | 40 | BBBBBB | 2019-04-17 15:28:08 | 0 | | 27 | BBBBBB | 2019-02-20 15:28:08 | 1 | | 17 | CCCCCC | 2019-03-04 15:28:08 | 0 | | 35 | CCCCCC | 2019-01-01 15:28:08 | 1 |
What SQL query can do that? (PostgreSQL)
P.S. in case it is much harder with groups having 3 and more items, I would be glad to have even SQL which processes data with groups having 2 items.
Schema and data
CREATE TABLE public.items ( id serial, name character varying(10) NOT NULL, version timestamp without time zone NOT NULL, is_deleted boolean default false, PRIMARY KEY (id) ) INSERT INTO public.items( id, name, version, is_deleted) VALUES (10, 'AAAAAA', '2019-04-14 15:28:08', false) (22, 'AAAAAA', '2019-03-04 15:28:08', false), (13, 'AAAAAA', '2019-02-10 15:28:08', false), (40, 'BBBBBB', '2019-04-17 15:28:08', false), (27, 'BBBBBB', '2019-02-20 15:28:08', false), (17, 'CCCCCC', '2019-03-04 15:28:08', false), (35, 'CCCCCC', '2019-01-01 15:28:08', false);