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

时间:2016-09-09 06:06:16

标签: sql oracle

一个例子是最好的解释。 让我们说我有下表:PersonCar(人与车的联合nx n)

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

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

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

它是一个oracle数据库。

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

假设组合(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);

答案 1 :(得分:1)

尝试这种方式怎么样:

Delete from PersonCar
where rowid in ( select row_id
                    from 
                    (
                    select  rowid row_id,    
                           personid , 
                           row_number() over(partition by personid order by personid,carid) rnk       
                    from PersonCar

                    )
                    where rnk >=3 
                 );