sql - postgresql 查询视图:对于每个作者,列出他们的共同作者总数
问题描述
样本数据和预期结果 试图创建查询以计算每个作者的共同作者总数。
我现有的数据库表将有 2 列 bookid 及其各自的作者,每个 bookid 可能有多个作者,每个作者可能写不止一本书。
我想创建一个包含 2 列作者姓名和共同作者总数的视图
例如,如果 book1 有 author1,author2,author3 而 book2 有 author1,author2,author4,那么作者 1 的合著者总数为 3
注意不要重复计算同一作者。
这个还是新的,试图把它写成一张桌子,但一团糟。谢谢!
样本数据:
(分贝<>小提琴)
person_id person_name book_id
2 B 1
3 C 2
4 D 2
5 E 2
3 C 3
4 D 3
6 F 3
4 D 4
8 H 4
9 I 4
10 J 4
预期结果:
person_name coauthors
B 0
C 3
D 6
E 2
F 2
H 3
I 3
J 3
ps:我有大约 2000+ 行作者和 bookid
解决方案
假设Books(author1, ... author4, bookid, ...)
某些author*
值可能为空的表。或者,辅助BookAuthors(bookid, author)
表允许任意数量的作者,以及更简单的查询
这看起来很乱,但利用UNION
(not UNION ALL
) 做 implicit DISTINCT
。
select first, count(distinct second)
from (select author1 first, author2 second from Books union
select author1, author3 from Books union
select author1, author4 from Books union
select author2, author1 from Books union
select author2, author3 from Books union
select author2, author4 from Books union
select author3, author1 from Books union
select author3, author2 from Books union
select author3, author4 from Books union
select author4, author1 from Books union
select author4, author2 from Books union
select author4, author3 from Books
) coauthors where first is not null and second is not null
推荐阅读
- unity3d - InvokeRepeating 生成太多游戏对象
- php - Wordpress Ajax 和 REST API 响应显示带有缓存结果的数据 WP Engine
- scala - 如何从列中获取唯一的字符串列表?
- angular - 允许 html/script 在 Angular 模板中嵌入代码
- php - 仅在页面上显示当前用户的 wordpress 评论
- javascript - Vue问题导航到错误页面和从错误页面导航
- javascript - jQuery Masonry 项目以错误的顺序堆叠
- xml - 带有 11 个字符时间戳的 XML 文件
- python - 如何模拟另一个.py使用的类及其方法
- react-native - npx react-native run-android 不起作用。“java.io.IOException:文件名、目录名或卷标语法不正确”