我希望计算分区上的最小值,但不应考虑当前行。
SELECT *,
MIN(val) OVER(PARTITION BY col1)
FROM table
输出分区中所有行的最小值。
documentation显示了使用CURRENT ROW的方法,但没有显示在执行窗口操作时如何排除它。
我正在寻找类似的东西:
SELECT *,
MIN(val) OVER(PARTITION BY col1 ROWS NOT CURRENT ROW)
FROM table
但这不起作用。
答案 0 :(得分:0)
我可以想办法做到这一点。除了当前行的窗口上的最小值将始终是窗口上的最小值 除了 ,当您所在的行是最小值时;然后min将是窗口的第2分钟。例如:
数据强>:
-----------
key | val
-----------
1 8
1 2
1 4
1 6
1 11
2 3
2 5
2 7
2 9
<强>查询强>:
select key, val, act_min, val_arr
, case when act_min=val then val_arr[1] else act_min
end as min_except_for_c_row
from (
select key, val, act_min, sort_array(val_arr) val_arr
from (
select key, val
, min(val) over (partition by key) act_min
, collect_set(val) over (partition by key) val_arr
from db.table ) A
) B
我将所有列留下来进行说明。您可以根据需要修改查询。
<强>输出强>:
key val act_min val_arr min_except_for_c_row
1 8 2 [2,4,6,8,11] 2
1 2 2 [2,4,6,8,11] 4
1 4 2 [2,4,6,8,11] 2
1 6 2 [2,4,6,8,11] 2
1 11 2 [2,4,6,8,11] 2
2 3 3 [3,5,7,9] 5
2 5 3 [3,5,7,9] 3
2 7 3 [3,5,7,9] 3
2 9 3 [3,5,7,9] 3