如何编写子查询来完成?

时间:2016-02-02 20:47:26

标签: postgresql

我有两张桌子: 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

如何实现以下目标?感谢。

1 个答案:

答案 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