我希望计算分区上的最小值,但不应考虑当前行。
SELECT *,
MIN(val) OVER(PARTITION BY col1)
FROM table
输出分区中所有行的最小值。
文档显示了使用 CURRENT ROW 的方法,但没有显示如何在执行窗口操作时排除它。
我正在寻找这样的东西:
SELECT *,
MIN(val) OVER(PARTITION BY col1 ROWS NOT CURRENT ROW)
FROM table
但这不起作用。
我可以想出一个办法来做到这一点。不包括当前行的窗口上的最小值将始终是窗口上的最小值除了,当您所在的行是最小值时;那么 min 将是窗口上的第二分钟。示例:
数据:
-----------
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
尝试这样的事情: 订购日期范围介于“3 天”之前和“1 天”之前