简体   繁体   中英

How to delete 90% of records from each group of a table (postgres)

I have a table called 'sales' in postgres which has a column called 'region'. I am trying to find out a way to delete 90% of records from each 'region' of the same table.

I am using the below query. But the same is not working in postgres and also the table does not have a primary/unique key column

delete from table
 ( select row_number() over (partition by region) as PAR 
   from sales
 )b  
where PAR >= 
 ( select S*0.1 as ninety
   from 
    ( select region, count(*) as S 
      from sales 
      group by region
    )a
and b.region = a.region

can anyone provide any better solution to this.

If you have an unique id in the table, you can do:

delete
    from t
    using (select t.*,
                  row_number() over (partition by region order by region) as seqnum,  -- I always include order by
                  count(*) over (partition by region) as cnt
           from t
          ) tt
    where t.id = tt.id and
          tt.seqnum < 0.9 * cnt;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM