我有一个针对大量连接的大表(行和列)的查询,但是其中一个表有一些重复的数据行导致我的查询出现问题。由于这是来自其他部门的只读实时订阅源,因此我无法修复该数据,但我正在尝试通过它来防止查询中的问题。
鉴于此,我需要将此垃圾数据作为左连接添加到我的好查询中。数据集如下所示:
IDNo FirstName LastName ... ------------------------------------------- uqx bob smith abc john willis ABC john willis aBc john willis WTF jeff bridges sss bill doe ere sally abby wtf jeff bridges ...
(约24列,100K行)
我的第一直觉是执行一个独特的给了我大约80K行:
SELECT DISTINCT P.IDNo FROM people P
但是,当我尝试以下操作时,我会收到所有行:
SELECT DISTINCT P.* FROM people P
要么
SELECT DISTINCT(P.IDNo) AS IDNoUnq,P.FirstName,P.LastName ...etc. FROM people P
然后我想我会在所有列上执行FIRST()聚合函数,但是这也感觉不对。从语法上讲,我在这里做错了吗?
更新:
只是想注意:这些记录是基于上面列出的非密钥/非索引的ID字段的重复记录。 ID是文本字段,虽然具有相同的值,但它与导致该问题的其他数据的情况不同。
解决方法
distinct不是一个功能。它始终在选择列表的所有列上运行。
您的问题是典型的“每组最大N”问题,可以使用窗口函数轻松解决:
select ... from ( select IDNo,FirstName,LastName,....,row_number() over (partition by lower(idno) order by firstname) as rn from people ) t where rn = 1;
使用order by子句,您可以选择要选择的重复项。
以上可用于左连接:
select ... from x left join ( select IDNo,row_number() over (partition by lower(idno) order by firstname) as rn from people ) p on p.idno = x=idno and p.rn = 1 where ...