我在配置单元CTE(with子句)中使用row_number窗口函数
with data(
select 1 a,1 b
union select 1,2
union select 1,3
union select 1,4
...
union select 1,26
),
data_with_row_num (
select a,b,row_number() over(partition by 1) as rn from data
)
select * from data_with_row_num
union all
select * from data_with_row_num
字符串
我认为row_number应该在CTE块中生成固定的id,我将临时表(data_with_row_num)合并了两次,并期望得到具有相同rn的相同b。
a b rn
1 4 1
1 2 1
1 9 2
1 3 2
...
1 19 26
1 24 26
型
似乎相同的rn有不同的B,我的问题是为什么会发生这种情况。我认为rn应该在with块中生成,但似乎它在使用时重新生成。
1条答案
按热度按时间lyfkaqu11#
原因是CTE(公共表表达式)只是表达式,这意味着它只是像脚本一样的东西,它不会具体化结果。
字符串
并且结果被
型
随机得到不同的结果,如果真的需要具体化临时结果,缓存表(在spark中)可能是一个解决方案
型