使用行 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 个唯一列的所有行?