Hive:窗口功能 - 如何排除CURRENT ROW

时间:2015-11-05 16:51:49

标签: hive

我希望计算分区上的最小值,但不应考虑当前行。

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

但这不起作用。

1 个答案:

答案 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