使用行id导出唯一行

时间:2016-07-07 04:47:26

标签: sql oracle oracle11g data-warehouse

我有一个巨大的表,重复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 那么有什么建议吗?

4 个答案:

答案 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)

谢谢每一个人...非常感谢快速响应...我想我曾尝试过类似的逻辑..但是请记住,但肯定会尝试..在子分区级别并检查..

但是我对你们所指定的每个人的快速提问,这会在查询块的导出参数中解决吗?