如何在配置单元中查找重复行?

58wvjzkj  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(311)

我想从一个配置单元表中找到重复的行,我得到了两种方法。
第一种方法是使用以下两个查询:

select count(*) from mytable; // this will give total row count

第二个查询如下,它将给出不同行的计数

select count(distinct primary_key1, primary_key2) from mytable;

使用这种方法,对于我的一个表,使用第一个查询得到的总行数是3500,第二个查询得到的行数是2700。所以它告诉我们 3500 - 2700 = 800 行重复。但是这个查询不会告诉哪些行是重复的。
我找到复制品的第二种方法是:

select primary_key1, primary_key2, count(*)
from mytable
group by primary_key1, primary_key2
having count(*) > 1;

上面的查询应该列出被复制的行以及特定行被复制了多少次。但是这个查询显示零行,这意味着该表中没有重复的行。
所以我想知道:
如果我的第一种方法是正确的-如果是,那么我如何找到哪些行是重复的
为什么第二种方法不提供重复行的列表?
有没有别的办法找到复制品?

yhqotfr8

yhqotfr81#

配置单元不验证主键和外键约束。
由于这些约束未经验证,因此上游系统需要在加载到配置单元之前确保数据完整性。
这意味着配置单元允许主键中的重复项。
要解决您的问题,您应该这样做:

select [every column], count(*)
from mytable
group by [every column]
having count(*) > 1;

这样您将得到重复行的列表。

vxf3dgd4

vxf3dgd42#

假设您希望基于特定列获取重复行 ID 在这里。下面的查询将为您提供在配置单元的表中重复的所有ID。

SELECT "ID"
FROM TABLE
GROUP BY "ID"
HAVING count(ID) > 1
kmbjn2e3

kmbjn2e33#

分析窗口函数row\ u number()非常有用,可以根据partition by子句中指定的元素提供重复项。然后,一个简单的inline view and exists子句将确定哪些相应的记录集包含原始表中的这些副本。在某些数据库中(如td,可以使用qualify pragma选项放弃内联视图)
sql1和sql2可以合并。sql2:如果您想处理空值而不是简单地消除,那么在将来合并和连接可能会更好

SELECT count(1) , count(distinct coalesce(keypart1 ,'') + coalesce(keypart2 ,'') )  
  FROM srcTable s

3) 查找所有记录,而不仅仅是>1记录。这提供了所有的上下文数据以及密钥,因此在分析为什么会有dup而不仅仅是密钥时非常有用。

select * from  srcTable s
where exists 
    ( select 1 from (
                SELECT  
                      keypart1,
                      keypart2,
                      row_number() over( partition by keypart1, keypart2 )  seq  
                FROM srcTable t 
                WHERE 
                  -- (whatever additional filtering you want) 
                ) t 
                where seq > 1 
                AND t.keypart1 = s.keypart1
                AND t.keypart2 = s.keypart2
    )

相关问题