首页 > 解决方案 > 结合具有独特特征的相似记录

问题描述

我有一个如下所示的数据列表:

|key|last  |first  |email    |degree  
|1  |Hope  |Bob    |a@1.com  |BA  
|1  |Hope  |Bob    |a@2.com  |MA  
|1  |Hope  |Bob    |a@1.com  |PhD  
|2  |Pane  |Pat    |b@1.com  |BA  
|2  |Pane  |Pat    |b@2.com  |MD 

我需要组合这些数据以显示同一字段的多个变体看起来像这样,以便有一个主键:

|key  |last  |first  |email1   |email2   |degree1  |degree2  |degree3    
|1    |Hope  |Bob    |a@1.com  |a@2.com  |BA  |MA  |  PhD   
|2    |Pane  |Pat    |b@1.com  |b@2.com  |BA  |MD  |  Null

这些列需要根据需要“生成”。例如,如果只有 1 条记录包含 19 封电子邮件,即使其余的最多只有 2 个,它也会生成 19 个电子邮件列。

我已经尝试自我加入,然后将其添加到一起:

SELECT a.key,a.last, a. first, a.email, a.degree 
b.key, b.last, b.first, b.email, b.degree 
FROM a 
LEFT JOIN b 
ON a.key = b.key and a.email=b.email and a.degree=b.degree

但我被卡住了。它没有正确加入。这是第一步。我在这里问,看看我是否走在正确的轨道上。它不应该只结合左表匹配的东西吗?它最终复制了记录。内部联接将消除只有 1 封电子邮件或部门的记录。只是在寻找一种方法来做到这一点。

有点卡住了。

标签: sqlite

解决方案


这些列需要根据需要“生成”。例如,如果只有 1 条记录包含 19 封电子邮件,即使其余的最多只有 2 个,它也会生成 19 个电子邮件列。

是一个问题,因为 sql 返回固定数量的列。

自联接示例返回所有行,因为 on 子句将 a 中的行与 b 中的行匹配。一对一。

group_concat () 聚合函数 可能会让您更接近,这取决于您打算如何使用结果。这个查询:

select key,first,last,group_concat(email) email_list,group_concat(degree) degree_list
from table
group by key

返回此结果:

key         first       last        email_list               degree_list
----------  ----------  ----------  -----------------------  -----------
1           Bob         Hope        a@1.com,a@2.com,a@1.com  BA,MA,PhD
2           Pat         Pane        b@1.com,b@2.com          BA,MD

推荐阅读