查找上一季度的空值并用上一季度的Snowflake SQL进行填充

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

我的实际桌子是这样的

user_id  date_at          quarter    type_class
123     2022-01-13 8:30:25   1       beginner
123     2022-02-13 7:29:25   1       beginner to mid
123     2022-04-26 17:30:59  2       mid
123     2022-12-15 12:30:33  4       expert

我的期望值好像是这样,我还是很困惑

  1. 如何用上季度的数据填充每季度的type_class(第3季度数据为空,用上季度的结果填充)
  2. 如何只上季度最新的课程(第一季度只上‘初级到中级’)
user_id  quarter  type_class
123      1        beginner to mid
123      2        mid
123      3        mid
123      4        expert

我当前的查询

WITH class0 AS (
    SELECT
        user_id,
        quarter(start_at) as quarters,
        type_class,
        date_at,
        ROW_NUMBER() OVER (PARTITION BY user_id, EXTRACT(QUARTER FROM start_at) ORDER BY start_at DESC) AS RowNum
    FROM
        class
    WHERE
        DATE(date_at) BETWEEN '2022-01-01' AND '2022-12-31'
)

SELECT
    user_id,
    quarters,
    type_class,
FROM
    class0
WHERE
    RowNum = 1
GROUP BY ALL

更新当前结果

user_id  quarter  type_class
123      1        beginner to mid
123      2        mid
123      4        expert

但是仍然无法定义其中一个季度是否为空,并取季度的最新值。

我感谢您的所有帮助。谢谢!

sql snowflake-cloud-data-platform logic
1个回答
0
投票

为了找到丢失的季度,您需要按季度 1、2、3 和 4 执行

CROSS JOIN
:

with class as (
  select  123  as user_id, '2022-01-13 8:30:25'::date as date_at,  1  as quartero, 'beginner' as type_class union all
  select  123,     '2022-02-13 7:29:25',   1,       'beginner to mid' union all
  select  123,     '2022-04-26 17:30:59',  2,       'mid' union all
  select  123,     '2022-12-15 12:30:33',  4,       'expert' 
),
cte as (
  select user_id, date_at, quarter(date_at) as quarter, type_class, 
         row_number() over (partition by user_id, quarter(date_at) order by date_at desc) as rn
  from class
),
cte2 as (
  select q.value, c.*, row_number() over (partition by user_id, q.value order by quarter desc) as rn_quarter
  from cte c 
  cross join table(flatten([1,2,3,4])) q
  where rn = 1 and q.value >= quarter
  order by q.value
)
select user_id, value as quarter, type_class
from cte2
where rn_quarter = 1;

结果:

USER_ID QUARTER TYPE_CLASS
123     1       beginner to mid
123     2       mid
123     3       mid
123     4       expert
© www.soinside.com 2019 - 2024. All rights reserved.