我的桌子是这样的:
WITH
my_table (user_id, date, event_name, value) AS (
values
(1,'2021-10-01', 'level', 5),
(1,'2021-10-03', 'purchase', null),
(1,'2021-10-05', 'purchase', null),
(2,'2021-10-02', 'level', 10),
(2,'2021-10-03', 'purchase', null)
)
SELECT *
FROM my_table
用户ID | 日期 | 事件名称 | 等级 |
---|---|---|---|
1 | 2021-10-01 | 等级 | 5 |
1 | 2021-10-03 | 购买 | |
1 | 2021-10-05 | 购买 | |
2 | 2021-10-02 | 等级 | 10 |
2 | 2021-10-03 | 购买 |
我想要的只是在每次购买之前为每个
level
添加最后一个 user_id
的列。
所需的表格应该是这样的
用户ID | 日期 | 事件名称 | 等级 | 达到等级 |
---|---|---|---|---|
1 | 2021-10-01 | 等级 | 5 | |
1 | 2021-10-03 | 购买 | 5 | |
1 | 2021-10-05 | 购买 | 5 | |
2 | 2021-10-02 | 等级 | 10 | |
2 | 2021-10-03 | 购买 | 10 |
谢谢你帮助我!
我建议您使用以下内容创建一个子查询:
user_id, level, date as date_start, lead(date) over(partition by user_id order by date asc) as date_end
(where level is not null)
您将得到如下结构:
user_id, level, date_start, date_end
接下来您可以加入:
my_table ON my_table.date >= sub_query.date_start
AND my_table.date < sub_query.date_end
通过此您可以轻松获得该特定日期范围的级别。
祝你好运
假设该级别无法下降,您可以仅使用
max
,这将忽略null
的:
SELECT *,
if(value is null, max(value) over(partition by user_id order by date)) level_achieved
FROM my_table;
输出:
用户ID | 日期 | 事件名称 | 价值 | 达到等级 |
---|---|---|---|---|
1 | 2021-10-01 | 等级 | 5 | 空 |
1 | 2021-10-03 | 购买 | 空 | 5 |
1 | 2021-10-05 | 购买 | 空 | 5 |
2 | 2021-10-02 | 等级 | 10 | 空 |
2 | 2021-10-03 | 购买 | 空 | 10 |
或使用
last_value
和 ignore nulls
选项:
SELECT *,
if(value is null, last_value(value) IGNORE NULLS over(partition by user_id order by date)) level_achieved
FROM my_table;