sql - 按周分组并在 postgresql 查询中对左连接字段求和

标签 sql postgresql

我想每周衡量每个客户在我的事件中的参与率。我的表:

  • event 有一个 start_datemax_nb_of_bookingsgroup_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/

相关文章:

sql - Golang 中的跨数据库准备好的语句绑定(bind)(like 和 where in)

mysql - 如何在 MySQL 中创建用户/组关联

c# - 从控制台运行 dotnet 核心应用程序时无法解决依赖关系

sql - 将两个 SELECT 查询合并为一个

sql - 带有连接和顺序的 Postgres RETURNING 子句

c++ - 为什么我不能让我的 CDatabase 对象理解我的数据源名称?

mySQL - 仅显示最常见的&所有其他列组合显示 0

sql - 从字符串中计算出的 id 作为数据库键

postgresql - 在 PyCharm Database Navigator 中访问 PostGIS 函数

ruby-on-rails - 我可以执行原始 sql 查询,利用准备好的语句,而不使用 ActiveRecord::Relation::QueryAttribute 吗?