【发布时间】:2021-12-31 01:29:51
【问题描述】:
我正在处理一个查询,以在每次发生由“where event = 1”指示的事件时返回接下来 7 天的数据。目标是按用户 ID 对所有数据进行分组,并在事件发生后对这些数据执行聚合函数 - 事件被编码为二进制 [0, 1]。
到目前为止,我一直在尝试使用嵌套的 select 语句来构造我想要的数据,但是使用窗口函数开始限制我。我现在认为自联接可能更合适,但在构建这样的查询时需要帮助。
查询当前首先创建按用户和日期分组的每日聚合值(第 3 级嵌套选择)。然后,第 2 级将数据“value_x”相加得到用户分组的聚合值。然后,第一级嵌套SELECT语句使用引线函数来抓取下一个行值,并由每个用户划分,每个用户划分,当event = 1.最后时,每个用户都在选择下一天的值时,SELECT语句使用聚合函数来计算平均值"sum_next_day_value_after_event" 按用户分组,其中 event = 1。放在一起,其中 event = 1,查询返回下一行总 value_x 的 avg(value_x)。
但是,这不符合我的时间规则; "where event = 1",返回事件发生后接下来 7 天的数据。如果没有 7 天的数据,则返回
这是我到目前为止的以下查询:
select
f.user_id
avg(f.sum_next_day_value_after_event) as sum_next_day_values
from (
select
bld.user_id,
lead(bld.value_x, 1) over(partition by bld.user_id order by bld.daily) as sum_next_day_value_after_event
from (
select
l.user_id,
l.daily,
sum(l.value_x) as sum_daily_value_x
from (
select
user_id, value_x, date_part('day', day_ts) as daily
from table_1
group by date_part('day', day_ts), user_id, value_x) l
group by l.user_id, l.day_ts
order by l.user_id) bld) f
group by f.user_id
下面是 table_1 数据的 sn-p:
| user_id | day_ts | value_x | event |
|---|---|---|---|
| 50 | 4/2/21 07:37 | 25 | 0 |
| 50 | 4/2/21 07:42 | 45 | 0 |
| 50 | 4/2/21 09:14 | 67 | 1 |
| 50 | 4/5/21 10:09 | 8 | 0 |
| 50 | 4/5/21 10:24 | 75 | 0 |
| 50 | 4/8/21 11:08 | 34 | 0 |
| 50 | 4/15/21 13:09 | 32 | 1 |
| 50 | 4/16/21 14:23 | 12 | 0 |
| 50 | 4/29/21 14:34 | 90 | 0 |
| 55 | 4/4/21 15:31 | 12 | 0 |
| 55 | 4/5/21 15:23 | 34 | 0 |
| 55 | 4/17/21 18:58 | 32 | 1 |
| 55 | 4/17/21 19:00 | 66 | 1 |
| 55 | 4/18/21 19:57 | 54 | 0 |
| 55 | 4/23/21 20:02 | 34 | 0 |
| 55 | 4/29/21 20:39 | 57 | 0 |
| 55 | 4/30/21 21:46 | 43 | 0 |
技术细节:
PostgreSQL,EDB 支持,版本 = 14.1
pgAdmin4,版本 5.7
感谢您的帮助!
【问题讨论】:
-
子查询中没有顶部/限制的订单无效。表没有行顺序,结果集有。 PSminimal reproducible example
标签: postgresql where-clause window-functions self-join