假设我只有一张桌子: members_tbl列是:SN,FN,DB,IDDBL,FLAG,DBLCRIT我需要更新表,如果这个算法有一些条件是正常的:
R.drawables.main_title
这是一个测试用例:
id_dup := 1;
FOR (i in 1 to Nrow(members_tbl)) THEN
{
FOR (j in (i+1) to Nrow(members_tbl)) THEN
{
IF(members_tbl(i).iddbl IS NULL) THEN
members_tbl(i).iddbl := id_dup
IF (((members_tbl(i).DBIRTH ==members_tbl(j).DBIRTH) AND
(UTL_MATCH.jaro_winkler_similarity(members_tbl(i).SNAME,members_tbl(j).SNAME) > 80) AND
(UTL_MATCH.jaro_winkler_similarity(members_tbl(i).FNAME,members_tbl(j).FNAME) > 80))
AND (members_tbl(j).iddbl IS NULL)) THEN
{
members_tbl(j).iddbl := id_dup;
members_tbl(i).flag := 1;
members_tbl(j).flag := 1;
members_tbl(i).dblcrit:= 1;
members_tbl(j).dblcrit:= 1;
}
}
id_dup := id_dup + 1;
}
更加全面,我确实改变了SNAME中的列SN,FNAME中的FN和DBIRTH中的DB
有没有办法在pl / sql程序中编写这个算法? 我是PL / SQL的新手,我从来没有写过存储过程。
答案 0 :(得分:0)
我认为这会奏效。您需要弄清楚它是如何确定哪一行是"更高"因此重复。
update members_tbl
set iddbl = 1
where iddbl is null and exists (
select 1
from members_tbl m2
where
m2.DB = members_tbl.DB
and UTL_MATCH.jaro_winkler_similarity(members_tbl.FN, m2.FN) > 80
and UTL_MATCH.jaro_winkler_similarity(members_tbl.SN, m2.SN) > 80
and NumberOfRow(m2) < NumberOfRow(members_tbl) /* ??? */
);
update members_tbl
set flag = 1, dblcrit = 1;
答案 1 :(得分:0)
实际上,正如@ shawnt00所建议的那样,它是基于Jaro Winkler函数的字符串近似的重复检测。因此,不需要count(不需要flag,dblcrit,iddbl),只需要一个左外连接:
SELECT * FROM (
SELECT m.IDM,
m2.IDM AS dups_key
FROM members_tbl m
LEFT OUTER JOIN members_tbl m2
ON ( m.IDM != m2.IDM
AND m.DBIRTH = m2.DBIRTH
AND utl_match.jaro_winkler_similarity(m.SNAME,m2.SNAME) > 80
AND utl_match.jaro_winkler_similarity(m.FNAME,m2.FNAME) > 80 )
)
Where dups_key IS NOT NULL;
从那以后,如果我使用过前面提到的计数器,我已经提取了我需要的其他信息;所以在以下链接中,以下是从上面第一个查询中提取的其他数据:this link.