我有两张桌子: 1.“authorCollection”包含密钥和作者 2.“书”包含关键和年份。
每本书都有一个独特的键,一本书可能有多位作者。 例如:
book:
key year
1 1999
2 2000
3 2001
authorCollection
key author
1 Tom
2 Tim
2 Tony
2 Mary
3 Tim
3 Tony
3 Alex
我希望在2000年(含)之后获得作者的不同合作者的平均数量。
2000年(含)之后, 蒂姆,他的合作是托尼,玛丽和亚历克斯。它是3个拼贴。
对玛丽来说,她的合作是蒂姆和托尼。它是2个拼贴。
对托尼来说,他的合作是蒂姆,玛丽和亚历克斯。它是3个拼贴。
对于亚历克斯来说,他的合作是蒂姆和托尼。它是2个拼贴。
平均值为(3 + 2 + 3 + 2)/ 4 = 2.5
如何编写查询语句来实现? 我可以在2000之后用查询使用“join”来过滤书,得到如下表:
SELECT key, sub1.author
FROM (
SELECT key, author FROM authorCollection
) sub1
JOIN (
SELECT * FROM book
WHERE year >= 2000
) sub2 USING (key)
key author
2 Tim
2 Tony
2 Mary
3 Tim
3 Tony
3 Alex
如何实现以下目标?感谢。
答案 0 :(得分:1)
首先加入authorCollection
以找到合作伙伴。我使用左连接是因为您看到TOM
没有合作伙伴。
然后计算每个人有多少不同的合作伙伴。
最后平均那些总数。
WITH partners as (
SELECT b.year, a1.author author1, a2.author author2
FROM authorCollection a1
LEFT JOIN authorCollection a2
ON a1.key = a2.key
AND a1.author <> a2.author
JOIN books b
ON b.key = a1.key
AND year >= 2000
), npartner as (
SELECT author1, COUNT(DISTINCT author2) np
FROM partners
GROUP BY author1
)
SELECT AVG(np)
FROM npartner
注意:强>
此
SELECT key, sub1.author
FROM (
SELECT key, author FROM authorCollection
) sub1
等于此,所以不需要复杂的事情
SELECT key, sub1.author
FROM authorCollection sub1