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聚合)
不相关注释:
日期
和用户
是数据库实体的不推荐名称,因为它们是保留关键字。您必须小心地处理它们(始终使用“
字符)。最好正确地重命名这些字符。此外,日期不太具有描述性。可能是登录\ 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