查找表中的相似之处

时间:2015-08-12 12:13:03

标签: sql database similarity

我有一张包含数千条记录的表格:

+-----+-------+------+----------+
| id  | group | code |  label   |
+-----+-------+------+----------+
| 1   | abc   | 345  | myLabel1 |
| 2   | abc   | 345  | myLabel4 |
| 3   | def   | 987  | myLabel2 |
| 4   | def   | 345  | myLabel4 |
| 5   | def   | 987  | myLabel2 |
| 6   | def   | 231  | myLabel1 |
| 7   | def   | 231  | myLabel9 |
| 8   | abc   | 345  | myLabel3 |
| 9   | def   | 987  | myLabel2 |
| 10  | def   | 345  | myLabel1 |
| ... | ...   | ...  | ...      |
+-----+-------+------+----------+

在此表中,某些条目彼此相似。

例如1,2和8:group为“abc”,code为“345”。
另一个例子是条目3,5和9:group是“def”,code是“987”,label是“myLabel2”。

正式可以说:

IF group = "abc", THEN code = "345"
IF group = "def" AND code = "987", THEN label = "myLabel2 "

我想在我的桌子上运行一个程序,找到那些相似之处。

PS:此表只是一个示例。它实际上有20多个不同名称的列。

3 个答案:

答案 0 :(得分:1)

你可以做第一个:

select group, min(code) as implied_code
from records 
group by group
having count(distinct code) = 1;

第二个:

select group, code, min(label) as implied_label
from records 
group by group, code
having count(distinct label) = 1;

注意:group是一个非常糟糕的列名,因为它是一个SQL保留字。

答案 1 :(得分:1)

尝试此操作仅返回具有相似性的行:

SELECT group, code, [column3], [column4], ..., [column20]
FROM table 
GROUP BY group, code, [column3], [column4], ..., [column20]
HAVING count(1) > 1

您必须将[columnX]替换为要检查相似性的列名。

答案 2 :(得分:1)

这将为您提供表中的重复行,其中包含时间发生次数

SELECT      [group], [code] , COUNT(1) as CNT
FROM        YourTableName
GROUP BY    [group], [code] 
HAVING      COUNT(1) > 1
ORDER BY CNT;