Postgresql 如何通过多个值将一个表聚合为相关表中作为值提供的列?

Postgresql 如何通过多个值将一个表聚合为相关表中作为值提供的列?,postgresql,Postgresql,我有这样一个用户表: Table user id | name | date 1 | alice | 2021-03-28 2 | bob | 2021-03-29 ... 和一张有联系人的桌子: Table contact id | user_id | contact | has_profile 1 | 1 | facebook | 1 2 | 1 | gmail | 1 3 | 1 | yahoo | 0 4 | 2

我有这样一个用户表:

Table user

id | name  | date
1  | alice | 2021-03-28
2  | bob   | 2021-03-29
...
和一张有联系人的桌子:

Table contact

id | user_id | contact  | has_profile
1  | 1       | facebook | 1
2  | 1       | gmail    | 1
3  | 1       | yahoo    | 0
4  | 2       | facebook | 0
5  | 2       | gmail    | 1
6  | 2       | yahoo    | 1
...
我想写一个查询,汇总不同日期联系人的平均比率,结果应该是:

date       | facebook | gmail | yahoo
2021-03-29 | 0.7      | 0.82  | 0.15
2021-03-28 | 0.75     | 0.85  | 0.18
...
我可以通过以下查询找到它:

select
    u."date",
    avg(f.has_profile) as facebook,
    avg(g.has_profile) as gmail,
    avg(y.has_profile) as yahoo
from user u
join contact f on f.user_id = u.id and f.contact = 'facebook'
join contact g on g.user_id = u.id and g.contact = 'gmail'
join contact y on y.user_id = u.id and y.contact = 'yahoo'
group by u."date"
order by u."date" desc
但问题是,此查询取决于表
contact
中的某些联系人姓名,因此如果联系人太多,则查询太长且复杂,无法修改。有没有一种方法可以告诉Postgresql自动提取联系人的姓名并对其进行聚合?

(根据注释中的要求进行JSON聚合)

  • 联接表
  • 按日期和联系人计算平均值
  • 将这些值聚合到JSON对象中

  • 不相关注释
    日期
    用户
    是数据库实体的不推荐名称,因为它们是保留关键字。您必须小心地处理它们(始终使用
    字符)。最好正确地重命名这些字符。此外,日期不太具有描述性。可能是
    登录\ u日期
    或其他什么

    否。无法动态调整日期(创建动态列数)@S-Man是否可以将列作为键打包到JSON字段中?这将解决我的问题。是的,这可能会起作用。请参阅我的回答谢谢您的解决方案。
    SELECT
        my_date,
        jsonb_object_agg(contact, avg)         -- 3
    FROM (
        SELECT
            my_date,
            contact,
            AVG(has_profile)                   -- 2
        FROM
            contact c
        JOIN users u ON c.user_id = u.id       -- 1
        GROUP BY my_date, contact
    ) s
    GROUP BY my_date