admin

删除行以在Oracle表中每个组具有最多x行

sql

一个例子是最好的解释。假设我有下表:PersonCar(人与汽车的关联nxn)

╔════════════╦═════════════╗  
║ PersonId   ║ CarId       ║  
╠════════════╬═════════════╣  
║ 1          ║ 1           ║  
║ 1          ║ 2           ║  
║ 1          ║ 3           ║  
║ 2          ║ 4           ║  
║ 2          ║ 5           ║  
╚════════════╩═════════════╝  

如果我按PersonId将此表分组,则ID = 1的人将关联3辆汽车。
我想删除表PersonCar的行,以使最多2个与一个人相关的汽车。我不在乎从协会中删除哪辆车。

这是一个例子。实际上,我有一个很大的测试表,上面放置了太多的关联(用于负载测试),现在,我想通过放置X关联最大值来进行清理。

这是一个oracle数据库。

谢谢您的帮助。


阅读 135

收藏
2021-07-01

共1个答案

admin

假设表中的组合(person_id, car_id)是唯一的,则可以执行以下操作:

delete from car_assignment 
where (person_id, car_id) 
        in (select person_id, car_id
            from (
              select person_id, 
                     car_id, 
                     row_number() over (partition by person_id order by car_id) as rn
              from car_assignment
            ) t 
            where rn > 2);
2021-07-01