我的实际桌子是这样的
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
我的期望值好像是这样,我还是很困惑
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
但是仍然无法定义其中一个季度是否为空,并取季度的最新值。
我感谢您的所有帮助。谢谢!
为了找到丢失的季度,您需要按季度 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