SQL LAG() 函数,条件为 where

问题描述 投票:0回答:2

我的桌子是这样的:

    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

谢谢你帮助我!

sql amazon-web-services amazon-s3 amazon-athena
2个回答
1
投票

我建议您使用以下内容创建一个子查询:

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

通过此您可以轻松获得该特定日期范围的级别。

祝你好运


0
投票

假设该级别无法下降,您可以仅使用

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;
© www.soinside.com 2019 - 2024. All rights reserved.