2013-07-01 78 views
0

我想出了一個公式來計算兩個記錄之間的相似性計算兩個記錄之間的相似性(通過公式),這是非常簡單與SQL查詢

相似度=沒有兩個記錄之間匹配的屬性/總沒有屬性的* 100

例如:

ID |First Name| Last Name| DOB  | Parent Last Name 
1 |John  |Doe  | 03/19/1989| Jonathan 
1 |John  |Doe  | 03/19/1998| Jonathan 

我們將獲得3/4的相似* 100 = 75%爲ID = 1。

我想在SQL查詢的幫助下實現這一點。我知道我可以用程序來做,但我想用SQL查詢來嘗試它。

以下步驟將計算此公式。

對於屬於一個特定ID的所有記錄比較所有的屬性,如果他們匹配,則1,否則爲0

獲得所有比賽的總和爲特定的ID。

計算給定ID的相似度。

如果您有任何問題,請讓我知道。

注:我使用SQL Server 2008的

+2

是否每個ID都應該有2行?如果可以有更多的話,那麼你是否需要比較每個人,看看他們是否都是相同的分配值'1'? – Lamak

+0

是的。可以有2個以上,但不能少於2.另外,是的,我們需要比較一個ID的所有記錄,然後如果它們匹配或者是0,則分配1,即使其中一個不匹配。 – Huzaifa

回答

2

我明白了,你正在試圖做的記錄的「內部ID」相似。這裏有一種方法:

select id, 
     ((case when min(FirstName) = max(FirstName) then 1.0 else 0 end) + 
     (case when min(LastName) = max(LastName) then 1.0 else 0 end) + 
     (case when min(DOB) = max(DOB) then 1.0 else 0 end) + 
     (case when min(ParentLastName) = max(ParentLastName) then 1.0 else 0 end) 
     )/4.0 as similarity 
from t 
group by id; 

這會忽略NULL值。

+0

如果忽略空值,它會給出值1嗎? – Huzaifa

+0

@John Yup,因爲它使用聚合函數。相當聰明,實際上,如果你想讓這個行爲不同,你可以使用'ISNULL'和一些虛擬值。 – Lamak

+0

@Lamak我同意。但是,當兩個值爲空時,它與它不匹配並賦值爲0. – Huzaifa