如何基于book_time分区获取最大book_type值替代LAG函数结果?
解决方案:基于book_time分区获取最大book_type实现需求
当然可以用这种方式,而且比你之前用的LAG窗口函数更稳妥——毕竟LAG返回空值大概率是因为uniq_step=804的行是对应book_time分区里的第一行,没有前置行可以取值。而通过分区聚合的方式,能直接拿到整个分区内的目标值,不受行顺序影响。
具体实现思路
核心是用MAX()窗口函数按book_time分区,筛选出分区内的book_type='poetry'值,再通过CASE WHEN将uniq_step=804的行替换为这个值:
SELECT book_id, -- 当uniq_step为804时,取对应book_time分区里的poetry值,否则保留原book_type CASE WHEN uniq_step = 804 THEN MAX(CASE WHEN book_type = 'poetry' THEN book_type END) OVER (PARTITION BY book_time) ELSE book_type END AS book_type, book_time, uniq_step, book_ordered FROM your_table;
补充优化
如果存在某些book_time分区里没有poetry类型的情况,可以用COALESCE给个默认值(比如保留原book_type):
CASE WHEN uniq_step = 804 THEN COALESCE(MAX(CASE WHEN book_type = 'poetry' THEN book_type END) OVER (PARTITION BY book_time), book_type) ELSE book_type END AS book_type
为什么这个方法比LAG靠谱?
LAG函数依赖于窗口内的行排序(比如你可能按book_ordered排序取前一行),如果uniq_step=804的行是分区的首行,自然拿不到前置值返回空。而MAX()窗口函数是扫描整个分区的所有行,只要分区内存在poetry类型,就能稳定获取到值,完全不受行的顺序影响。
内容的提问来源于stack exchange,提问作者DrGenius
相关产品推荐
相关产品推荐

