sqlite - 结合具有独特特征的相似记录
问题描述
我有一个如下所示的数据列表:
|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 封电子邮件或部门的记录。只是在寻找一种方法来做到这一点。
有点卡住了。
解决方案
这些列需要根据需要“生成”。例如,如果只有 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
推荐阅读
- javascript - 如何从 JQuery AJAX 生成的 HTML 数据中获取属性 id?JavaScript
- node.js - 如何通过 REST API 从 IONIC typescript 读取 node.js app.js 中的数据?
- go - 调用结构上的方法时,Goroutines 不起作用
- makefile - 由于安装 ROS 时 CPU 使用率达到 100,Raspberry Pi 冻结
- javascript - 如何从javascript中的表单数据中删除选定的输入对象?
- python - 在购物车模型中总计 Django Admin 中每个 TabularInline 条目的小计
- birt - 使用 json 字符串作为报告参数将 JSON 转换为 POJO
- docker - 在 Amazon ECS 上运行的 nginx + uwsgi 返回套接字:打开的文件太多 (24)(更改 Ulimit 没有帮助)
- cordova - 获取设备 uuid ionic 3?
- javascript - Laravel 将 localhost MySql 数据库同步到托管服务器