Hive:窗口函数 - 如何排除当前行

问题描述 投票:0回答:2

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

SELECT *,
       MIN(val) OVER(PARTITION BY col1)
FROM table

输出分区中所有行的最小值。

文档显示了使用 CURRENT ROW 的方法,但没有显示如何在执行窗口操作时排除它。

我正在寻找这样的东西:

SELECT *,
       MIN(val) OVER(PARTITION BY col1 ROWS NOT CURRENT ROW)
FROM table

但这不起作用。

hive
2个回答
0
投票

我可以想出一个办法来做到这一点。不包括当前行的窗口上的最小值将始终是窗口上的最小值除了,当您所在的行是最小值时;那么 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

0
投票

尝试这样的事情: 订购日期范围介于“3 天”之前和“1 天”之前

© www.soinside.com 2019 - 2024. All rights reserved.