我有一个巨大的表,重复500 GB,有分区,有近20亿条记录。
我打算写一个条件,如果3列值匹配,那么选择那些记录,(比如我们得到4个重复记录)。并使用最小/最大行ID来导出其中一个记录。
我知道可能有不同的方法,比如删除或创建新的表xyz。但我们决定在导出中使用查询选项。所以如果有人能给我一个正确的语法,请帮助我。
我一直在尝试:
query= schema.table:"WHERE ROWID <>
(SELECT MAX(ROWID) FROM schema.table A WHERE A.col1 = A.col1 AND A.col2 = A.col2 AND A.col3 = A.col3)"
但这可能需要重复,我尝试使用=和&lt; =符号,这并没有帮助我。它不导出任何行,表示导出0 那么有什么建议吗?
答案 0 :(得分:2)
使用analytic function获取每个组的最低要求;这只需要一次表扫描(即没有相关的子查询)。
SELECT a,b,c -- ,d,e,f,g ...
FROM (
SELECT t.*,
ROWID AS rid,
MIN( ROWID ) OVER ( PARTITION BY a, b, c ) AS min_rid
FROM schema_name.table_name t
)
WHERE rid = min_rid;
答案 1 :(得分:1)
使用您的dublicate列进行分组
select a,b,c, count(*), min(rowid), max(rowid)
from your_table
group by a,b,c
having count(*) > 1
然后你可以选择像这样的所需行
select *
from your_table
where rowid in (
select min(rowid)--, max(rowid)
from your_table
group by a,b,c
having count(*) > 1
)
抱歉,如果你需要所有行包括uniq和1行的dublicate,不需要
select *
from your_table
where rowid in (
select min(rowid)--, max(rowid)
from your_table
group by a,b,c
)
答案 2 :(得分:1)
您可以使用NOT EXIST运算符从具有最高ROWID的表中选择一条记录:
SELECT *
FROM table A
WHERE NOT EXISTS (
SELECT 1 FROM table B
WHERE A.col1 = B.col1 AND A.col2 = B.col2 AND A.col3 = B.col3
AND A.ROWID < B.ROWID
)
答案 3 :(得分:0)
谢谢每一个人...非常感谢快速响应...我想我曾尝试过类似的逻辑..但是请记住,但肯定会尝试..在子分区级别并检查..
但是我对你们所指定的每个人的快速提问,这会在查询块的导出参数中解决吗?