我想从表中删除一组行.我可以决定哪些行需要删除.只有当行数大于5(基于条件)时,我才会从表中删除行.
考虑这个示例数据
ID--Col1--Col2--
1 A X
2 A X
3 A X
4 A X
5 A X
6 A X
7 A X
8 A X
9 A X
10 A X
11 B X
12 B X
13 B X
14 B X
15 C X
16 C X
17 C X
18 D X
19 D X
Run Code Online (Sandbox Code Playgroud)
我想删除5行{*,A,X},我需要保留5行(无论哪一行).我不会删除B,C&D,因为它们的数量小于5.
喜欢
delete from tableA
--- I can decide on the rows to delete based on two conditions.
where col1 = someCondition
and col2 = someOtherCondition
and rownum > 5 --- This dint work. I checked.
Run Code Online (Sandbox Code Playgroud)
我想也许我需要programmaticaly.任何建议都非常感谢.
这将删除col1和col2的每个唯一组合的所有行,而不是rowid排序的前五个
delete from my_table
where rowid in
(
select rowid
from
(
select rowid,
row_number() over (partition by col1, col2 order by rowid) rownumber
from my_table
)
where rownumber > 5
)
/
Run Code Online (Sandbox Code Playgroud)
这将删除除了满足Col1和Col2两个条件的20行之外的所有行:
DELETE FROM tableA
WHERE ROWID NOT IN (SELECT ROWID
FROM tableA
WHERE col1 = someCondition
AND col2 = someOtherCondition
AND rownum <= 20)
Run Code Online (Sandbox Code Playgroud)
如果您的数据集非常大,则以下内容可能会更快:
CREATE tableTemp as
SELECT *
FROM tableA
WHERE col1 = someCondition
AND col2 = someOtherCondition
AND rownum <= 20;
TRUNCATE tableA;
INSERT INTO tableA (SELECT * FROM tableTemp);
Run Code Online (Sandbox Code Playgroud)
如果需要在操作期间访问数据,请用DELETE替换truncate.
| 归档时间: |
|
| 查看次数: |
13388 次 |
| 最近记录: |