使用行 ID 导出唯一行

Posted

技术标签:

【中文标题】使用行 ID 导出唯一行【英文标题】:exporting unique rows using row id 【发布时间】:2016-07-07 04:47:26 【问题描述】:

我有一个巨大的表,其中包含 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)"

但这可能会重复,我只尝试了 = 和

【问题讨论】:

【参考方案1】:

使用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;

【讨论】:

【参考方案2】:

您可以使用 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】:

使用拥有并按您的重复列分组

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 行的重复内容,则不需要

select * 
      from your_table 
     where rowid in (
        select min(rowid)--, max(rowid)
          from your_table
         group by a,b,c
    )

【讨论】:

注意,这不会导出唯一的行,而是那些有重复的行。【参考方案4】:

谢谢大家...非常感谢快速响应..我想我已经尝试过类似的逻辑..dnt记住但肯定会尝试..在子分区级别并检查..

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

【讨论】:

以上是关于使用行 ID 导出唯一行的主要内容,如果未能解决你的问题,请参考以下文章

将一对多关系显示为 2 列 - 1 个唯一行(ID 和逗号分隔列表)

如何使用 Sequelize.JS 选择具有 2 个唯一列的所有行?

使用 JPA 创建唯一并合并数据库中的现有行

组合行 + 连接大型数据集的值(将 SQL 导出转换为多值)

仅插入唯一行并更新已存在的行

从多个表中获取唯一行