我想每周衡量每个客户在我的事件中的参与率。我的表:
- 表
event
有一个start_date
、max_nb_of_bookings
、group_id
字段 - 表
booking
有一个链接到事件 ID 的event_id
字段。
我目前有给定团体每周的预订总和(:
select count(distinct booking.id) as bookings,
date_trunc('week', event.start_date::date) as week
from event
left join booking on event.id = booking.event_id
where event.group_id = 2
group by week
order by week desc
这给了我类似的东西
bookings | week
-------------------------------------
8 | 2019-02-04 00:00:00.000000
39 | 2019-01-28 00:00:00.000000
39 | 2019-01-21 00:00:00.000000
35 | 2019-01-14 00:00:00.000000
39 | 2019-01-07 00:00:00.000000
14 | 2018-12-31 00:00:00.000000
0 | 2018-12-24 00:00:00.000000
到目前为止,还不错。我也可以有可用预订位的累计数量:
select sum(event.max_nb_of_bookings) as places,
date_trunc('week', event.start_date::date) as week
from event
where event.group_id = 2
group by week, event.id
order by week desc
这给了我:
places | week
-----------------------------------
54 | 2019-02-04 00:00:00.000000
54 | 2019-01-28 00:00:00.000000
63 | 2019-01-21 00:00:00.000000
48 | 2019-01-14 00:00:00.000000
49 | 2019-01-07 00:00:00.000000
36 | 2018-12-31 00:00:00.000000
12 | 2018-12-24 00:00:00.000000
现在我要百分比:
select round(1.0 * count(distinct booking.id) / sum(event.max_nb_of_bookings) * 100, 2) as filling,
date_trunc('week', event.start_date::date) as week
from event
left join booking on event.id = booking.event_id
where event.group_id = 2
group by week
order by week desc
我明白了:
filling | week
------------------------------------
12.12 | 2019-02-04 00:00:00.000000
16.25 | 2019-01-28 00:00:00.000000
16.05 | 2019-01-21 00:00:00.000000
16.67 | 2019-01-14 00:00:00.000000
17.41 | 2019-01-07 00:00:00.000000
14.58 | 2018-12-31 00:00:00.000000
0 | 2018-12-24 00:00:00.000000
这很奇怪,因为它们中的大多数应该在 50% 以上。当我要求两个单独的值时,我看到了问题:
select count(distinct booking.id) as bookings,
sum(event.max_nb_of_bookings) as places,
date_trunc('week', event.start_date::date) as week
from event
left join booking on event.id = booking.event_id
where event.group_id = 2
group by week
order by week desc
bookings | places | week
----------------------------------------------
8 | 66 | 2019-02-04 00:00:00.000000
39 | 240 | 2019-01-28 00:00:00.000000
39 | 243 | 2019-01-21 00:00:00.000000
35 | 210 | 2019-01-14 00:00:00.000000
39 | 224 | 2019-01-07 00:00:00.000000
14 | 96 | 2018-12-31 00:00:00.000000
0 | 12 | 2018-12-24 00:00:00.000000
似乎一个 select 语句中的“distinct”混淆了另一个语句中的“sum”。如果我尝试按事件分组,我会失去每周总和...我需要一些帮助
最佳答案
这个问题与您对 count(distinct booking.id) 和 sum(event.max_nb_of_bookings) 的不同分组有关
例如:
在下面的查询中,您每周计算不同的 booking.id
select count(distinct booking.id) as bookings,
date_trunc('week', event.start_date::date) as week
from event
left join booking on event.id = booking.event_id
where event.group_id = 2
group by week /*Note the group by is by week only*/
在这里,您按每个 event.id 总结 event.max_nb_of_bookings
select sum(event.max_nb_of_bookings) as places,
date_trunc('week', event.start_date::date) as week
from event
where event.group_id = 2
group by week, event.id /*Group by event.id and week*/
所以在你的记录集中你可以有一个结果集如下
places | week |event.id
-----------------------------------
54 | 2019-02-04 00:00:00.000000 |1
12 | 2019-02-04 00:00:00.000000 |2 ---> There can be a record as follows
54 | 2019-01-28 00:00:00.000000 |3
63 | 2019-01-21 00:00:00.000000 |3
48 | 2019-01-14 00:00:00.000000 |4
49 | 2019-01-07 00:00:00.000000 |5
36 | 2018-12-31 00:00:00.000000 |6
12 | 2018-12-24 00:00:00.000000 |7
因此输出
选择 sum(event.max_nb_of_bookings) 作为地点, date_trunc('week', event.start_date::date) 作为一周 从事件 其中 event.group_id = 2 按周分组
会是
places | week
-----------------------------------
66 | 2019-02-04 00:00:00.000000
54 | 2019-01-28 00:00:00.000000
63 | 2019-01-21 00:00:00.000000
48 | 2019-01-14 00:00:00.000000
49 | 2019-01-07 00:00:00.000000
36 | 2018-12-31 00:00:00.000000
12 | 2018-12-24 00:00:00.000000
关于sql - 按周分组并在 postgresql 查询中对左连接字段求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54481426/