尝试根据以下内容为会话中的每个提要视图填充字段 has_impact。
当(view_end_time - view_start_time) > 3
和view_perc > 0.8
之间存在差异时,has_impact
为true,否则为false。
- view_logs* 表
create table view_logs(session_id varchar(10), post_id int,
ts int, event_name varchar(50), view_perc float);
insert into view_logs(session_id, post_id, ts, event_name, view_perc)
values
('m1', 1000, 1524600, 'view_start', null),
('m1', 1000, 1524602, 'view_end', 0.85),
('m1', 1000, 1524650, 'view_start', null),
('m1', 1000, 1524654, 'view_end', 0.9),
('m1', 2000, 1524700, 'view_start', null),
('m1', 2000, 1524707, 'view_end', 0.3),
('m1', 2000, 1524710, 'view_start', null),
('m1', 2000, 1524713, 'view_end', 0.9);
我尝试了**this fiddle**,但没有得到所需的输出。谁能帮我找出我做错了什么?
查询:
with cte as
(
select
pv1.session_id,
pv1.post_id,
pv2.view_perc,
pv1.ts as start_time,
min(pv2.ts) as end_time
from view_logs pv1
join view_logs pv2
on pv1.session_id = pv2.session_id
and pv1.post_id = pv2.post_id
and pv1.event_name <> pv2.event_name
and pv1.ts < pv2.ts
group by
pv1.session_id,
pv1.post_id,
pv2.view_perc,
pv1.ts
)
select
session_id,
post_id,
start_time,
end_time,
case
when (end_time - start_time > 3 and view_perc > 0.8 )then 'yes'
else 'no'
end as has_meaningful_view
from cte
期望输出:
*--------------------------------------------------------*
|session_id| post_id | start_time | end_time | has_impact|
*--------------------------------------------------------*
| m1 | 1000 | 1524600 | 1524602 | no |
| m1 | 1000 | 1524650 | 1524654 | yes |
| m1 | 2000 | 1524700 | 1524707 | no |
| m1 | 2000 | 1524710 | 1524713 | no |
*--------------------------------------------------------*
4条答案
按热度按时间2nbm6dog1#
假设每个开始时间都有一个结束时间,可以使用row_number函数进行聚合,如下所示:
Demo
1sbrub3j2#
每个带有view_start的记录和它后面带有view_end的记录可以使用self join连接,因为你没有递增的列,我们可以使用
row_number()
构造一个列,用作join子句的条件:Demo here
qcbq4gxm3#
这可能无法得到您想要的结果,但它确实计算
has_impact
列输出:
| 会话ID| post_id|开始时间|结束时间|有影响|
| - -----|- -----|- -----|- -----|- -----|
| m1|一千|1524600|零|假的|
| m1|一千|零|1524602|假的|
| m1|一千|1524650|零|假的|
| m1|一千|零|1524654|真的|
| m1|二千年|1524700|零|假的|
| m1|二千年|零|1524707|假的|
| m1|二千年|1524710|零|假的|
| m1|二千年|零|1524713|假的|
osh3o9ms4#
假设每一个结束都有一个紧接在它前面的开始,你可以在一个子查询中简单地使用窗口函数
lag()
一次:fiddle
应该是最快的,因为它只需要一个单一的通过表。
如果我的假设不成立,声明我们可以假设什么 * 确切 *。