Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 配置单元:窗口函数-如何排除当前行_Hive - Fatal编程技术网

Hive 配置单元:窗口函数-如何排除当前行

Hive 配置单元:窗口函数-如何排除当前行,hive,Hive,我希望计算分区上某个值的最小值,但不应考虑当前行 SELECT *, MIN(val) OVER(PARTITION BY col1) FROM table 输出分区中所有行的最小值 显示使用当前行的方法,但不显示如何在执行窗口操作时排除当前行 我在找这样的东西: SELECT *, MIN(val) OVER(PARTITION BY col1 ROWS NOT CURRENT ROW) FROM table 但这不起作用。我可以想出一种方法来做到这一点。不包括

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

SELECT *,
       MIN(val) OVER(PARTITION BY col1)
FROM table
输出分区中所有行的最小值

显示使用当前行的方法,但不显示如何在执行窗口操作时排除当前行

我在找这样的东西:

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

但这不起作用。

我可以想出一种方法来做到这一点。不包括当前行的窗口上的最小值将始终是窗口上的最小值除非当您所在的行是最小值时,;然后min将是窗口上方的第2 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
查询

-----------
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
我把所有的专栏都留了下来以作说明。您可以根据需要修改查询

输出

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