我正在开展一个项目,我必须检查重复的记录,并辨别我必须保留哪些记录。根据我们正在查看的属性,记录需要满足一般标准。下表检查了标准之间的关系。
表1
+----------+-----+-------+-------+-------+-------+
| dup_id | idm | ucode | great | good |yo2005 |
+----------+-----+-------+-------+-------+-------+
| a | 1 | 6 | yes | yes | yes |
| a | 2 | 1 | no | yes | yes |
| a | 3 | 1 | no | no | yes |
| b | 4 | 1 | yes | yes | no |
| b | 5 | 1 | no | no | no |
| c | 6 | 7 | no | no | yes |
| c | 7 | 1 | yes | no |no |
| d | 8 | 6 | no | yes |no |
| d | 9 | 1 | yes | no |no |
| e | 10 | 3 | yes | no |yes |
| e | 11 | 4 | no | yes |no |
| f | 12 | 1 | yes | yes | yes |
| f | 13 | 1 | yes | no |yes |
| g | 14 | 1 | no | no |yes |
| g | 15 | 1 | yes | no |no |
+----------+----+--------+-------+-------+-------+
表2
+-----+-------+
| ido | yo1998|
+-----+-------+
| 1 | yes |
| 2 | no |
| 3 | no |
| 4 | no |
| 5 | no |
| 6 | no |
| 7 | no |
| 8 | yes |
| 9 | yes |
| 10 | yes |
| 11 | yes |
| 12 | yes |
| 13 | no |
| 14 | yes |
| 15 | no |
+----+-------+
这些表格包含我们想要保留的其他记录,但这些记录符合标准
表1
• dup_id - 这是与之关联的所有重复项集合的ID。这可以有2个或更多与之关联的记录
• idm - 表1中记录的ID与表2中的ido匹配
• ucode - 此属性具有来自先前分类的重复指示符。如果它是值6,那么它被认为是重复的(但由于某种原因,新算法接受它为非重复)
•很棒 - 这是一个首选的字段,因为它已在某个时候得到验证
•良好 - 这是首选的字段,但尚未经过验证
• yo2005 - 2005年收集的数据
表2
• ido - 表2中的记录ID;匹配表1中的idm
• yo1998 - 1998年收集的数据
问题是,我们有很多记录需要筛选。我一直在尝试做的是为每个标准开发一个查询,以尝试过滤我们需要查看的数据。 标准 标准的重要性顺序如下:
• ucode - 如果dupid中的某个记录的ucode = 6,则表示它已被称为重复记录,因此其他ucodes优先。例如,dupid d有2条记录,所以我们知道正确的是idm = 8。例如,如果我们的表有10,000条记录,这可能会有2000条记录,这使我们需要手动检查8000条记录。
•伟大 - 这是我们的第二重要级别。如果great = yes,那么我们希望从第一个查询未解析的任何记录中选择此记录。例如,在上面的查询中剩下的8000中,这可能会获得另外1000个,我们需要手动检查7000个。
•良好 - 这对我们来说是第三级别的重要性。如果伟大=不,但好=是,那么这将是我们选择的任何未事先解决的问题。例如,在上面的查询中留下的7000中,这可能会获得另外500个,我们需要手动检查6500。
•此时我们有两张桌子;我们的第四个优先事项是 yo2005和yo1998 =是。例如,在上面的查询中剩下的6500中,这可能会接收另外1000个,让我们手动检查5500。
•如果两者不等于是, yo2005 是我们的第五优先事项。例如,在上面的查询中剩下的5500中,这可能会接收另一个2000,让我们手动检查3500。
• yo1998 ='是'是我们的最终优先事项。例如,在上面查询中剩下的3500中,这可能会获得另外1000个,让我们手动检查2500个。
正如您所看到的,这将削减对记录的大量人工检查。
理想情况下,会有2个输出表;一个适合所有符合critera的记录(即7500条记录)。也许甚至可以用它的理由创建一个新的领域,由它所基于的标准来填充。我们还需要另一个包含不符合任何条件的记录的表,以便我们可以进一步调查这些记录以确定哪些是重复的。不幸的是,我不太熟悉sql,所以我甚至不知道这样的事情是否可行。 谢谢你的时间。
答案 0 :(得分:0)
您可以在SQL中编写所有这些内容。下面是ucode之一。它选择所有具有两条记录的重复项,其中一条记录具有ucode = 6.然后选择另一条记录:
SELECT *
FROM t1
WHERE ucode <> 6
AND dupid IN
(SELECT dupid
FROM t1
INNER JOIN t2
ON t1.idm = t2.ido
GROUP BY dupid
HAVING COUNT(*) = 2
AND EXISTS
(SELECT 1
FROM t1 sub
WHERE ucode = 6
AND sub.dupid = t1.dupid))
这个会给你所有标记为伟大的记录,ucode不是= 6:
SELECT *
FROM t1
WHERE great = 'yes'
AND ucode <> 6
这个将为您提供标记为良好的所有记录,这些记录在同一个重复标记为伟大的记录中没有记录,不包括那些使用ucode = 6的记录:
SELECT *
FROM t1
WHERE good = 'yes'
AND ucode <> 6
AND NOT EXISTS
(SELECT 1
FROM t1 sub
WHERE great = 'yes'
AND sub.dupid = t1.dupid)
这个找到yo2005 = yes和great = no和good = no且unicode不等于6的所有记录:
SELECT *
FROM t1
WHERE yo2005 = 'yes'
AND ucode <> 6
AND NOT EXISTS
(SELECT 1
FROM t1 sub
WHERE (great = 'yes'
OR good = 'yes')
AND sub.dupid = t1.dupid)
最后,这个显示了yo1998 = yes且所有其他条件都失败的记录:
SELECT *
FROM t1
INNER JOIN t2
ON t1.idm = t2.ido
WHERE yo1998 = 'yes'
AND ucode <> 6
AND NOT EXISTS
(SELECT 1
FROM t1 sub
WHERE (great = 'yes'
OR good = 'yes'
OR yo2005 = 'yes')
AND sub.dupid = t1.dupid)
希望这对你有用!
答案 1 :(得分:0)
我不确定你将如何使用它,但它可能有所帮助。我相信它会给你最后一段中的两个表(合二为一); &#34;优先级&#34;是一个数字,对应于您的六个标准。
with
table_1 ( dup_id, idm, ucode, great, good, yo2005 ) as (
select 'a', 1, 6, 'yes', 'yes', 'yes' from dual union all
select 'a', 2, 1, 'no' , 'yes', 'yes' from dual union all
select 'a', 3, 1, 'no' , 'no' , 'yes' from dual union all
select 'b', 4, 1, 'yes', 'yes', 'no' from dual union all
select 'b', 5, 1, 'no' , 'no' , 'no' from dual union all
select 'c', 6, 7, 'no' , 'no' , 'yes' from dual union all
select 'c', 7, 1, 'yes', 'no' , 'no' from dual union all
select 'd', 8, 6, 'no' , 'yes', 'no' from dual union all
select 'd', 9, 1, 'yes', 'no' , 'no' from dual union all
select 'e', 10, 3, 'yes', 'no' , 'yes' from dual union all
select 'e', 11, 4, 'no' , 'yes', 'no' from dual union all
select 'f', 12, 1, 'yes', 'yes', 'yes' from dual union all
select 'f', 13, 1, 'yes', 'no' , 'yes' from dual union all
select 'g', 14, 1, 'no' , 'no' , 'yes' from dual union all
select 'g', 15, 1, 'yes', 'no' , 'no' from dual
),
table_2 ( ido, yo1998 ) as (
select 1, 'yes' from dual union all
select 2, 'no' from dual union all
select 3, 'no' from dual union all
select 4, 'no' from dual union all
select 5, 'no' from dual union all
select 6, 'no' from dual union all
select 7, 'no' from dual union all
select 8, 'yes' from dual union all
select 9, 'yes' from dual union all
select 10, 'yes' from dual union all
select 11, 'yes' from dual union all
select 12, 'yes' from dual union all
select 13, 'no' from dual union all
select 14, 'yes' from dual union all
select 15, 'no' from dual
)
select t1.dup_id, t1.idm, t1.ucode, t1.great, t1.good, t1.yo2005, t2.yo1998,
case when ucode = 6 then 1
when great = 'yes' then 2
when good = 'yes' then 3
when yo2005 = 'yes' then case when yo1998 = 'yes' then 4
else 5
end
when yo1998 = 'yes' then 6
end as priority
from table_1 t1 left outer join table_2 t2 on t1.idm = t2.ido
order by dup_id, priority
;
<强>输出强>:
DUP_ID IDM UCODE GREAT GOOD YO2005 YO1998 PRIORITY
------ ---- ----- ----- ---- ------ ------ --------
a 1 6 yes yes yes yes 1
a 2 1 no yes yes no 3
a 3 1 no no yes no 5
b 4 1 yes yes no no 2
b 5 1 no no no no
c 7 1 yes no no no 2
c 6 7 no no yes no 5
d 8 6 no yes no yes 1
d 9 1 yes no no yes 2
e 10 3 yes no yes yes 2
e 11 4 no yes no yes 3
f 12 1 yes yes yes yes 2
f 13 1 yes no yes no 2
g 15 1 yes no no no 2
g 14 1 no no yes yes 4
15 rows selected
ADDED :以下是一种使用此方法(作为子查询)进一步分析结果的方法。请参阅下面的OP评论。 DUP_ID = a
和d
根本不会出现在输出中,因为每个都有一行UCODE=6
;对于每个其他DUP_ID
,选择具有最高PRIORITY
的行(如果存在关联,则选择DUP_ID
的一个随机行(来自PRIORITY
最高的行)
with
table_1 ( dup_id, idm, ucode, great, good, yo2005 ) as (
....
),
table_2 ( ido, yo1998 ) as (
....
),
final ( dup_id, idm, ucode, great, good, yo2005, yo1998, priority ) as (
select t1.dup_id, t1.idm, t1.ucode, t1.great, t1.good, t1.yo2005, t2.yo1998,
case when ucode = 6 then 1
when great = 'yes' then 2
when good = 'yes' then 3
when yo2005 = 'yes' then case when yo1998 = 'yes' then 4
else 5
end
when yo1998 = 'yes' then 6
end as priority
from table_1 t1 left outer join table_2 t2 on t1.idm = t2.ido
),
o ( dup_id, idm, ucode, great, good, yo2005, yo1998, priority, rn ) as (
select dup_id, idm, ucode, great, good, yo2005, yo1998, priority,
row_number() over (partition by dup_id order by priority)
from final
)
select dup_id, idm, ucode, great, good, yo2005, yo1998, priority
from o
where rn = 1 and priority > 1;
DUP_ID IDM UCODE GREAT GOOD YO2005 YO1998 PRIORITY
------ --- ----- ----- ----- ------ ------ --------
b 4 1 yes yes no no 2
c 7 1 yes no no no 2
e 10 3 yes no yes yes 2
f 12 1 yes yes yes yes 2
g 15 1 yes no no no 2