如何在Hive中实现Oracle的"func(...) keep (dense_rank ...)"



我在Oracle DB

中有一个表ABCD
  +-------------+----------+
  | abcd.speed  | abcd.ab  |
  +-------------+----------+
  | 4.0         | 2        |
  | 4.0         | 2        |
  | 7.0         | 2        |
  | 7.0         | 2        |
  | 8.0         | 1        |
  +-------------+----------+

我正在使用这样的查询:

select min(speed) keep (dense_rank last order by abcd.ab NULLS FIRST) MOD from abcd;

我正在尝试将代码转换为Hive,但看起来keep在Hive中不可用。
您能建议一个等效的语句吗?

select  -max(struct(ab,-speed)).col2 as mod
from    abcd
;

+------+
| mod  |
+------+
| 4.0  |
+------+

让我们开始解释min(speed) keep (dense_rank last order by abcd.ab NULLS FIRST):找到具有ab的最大值的行。
对于此行,找到speed的最小值。

我们在这里使用了2个技巧。
第一个基于获得结构的最大值的能力。
max(struct(c1,c2,c3,...))返回相同的结果,就像您已经按c1对结构进行了排序,然后由c2,然后由c3等。然后选择了最后一个元素。

第二个技巧是使用-speed(在-1*speed中是相同的(。查找-speed的最大值,然后以该值的减去(为我们提供speed(,找到speed的最小值。

如果我们要订购结构,那将看起来像这样(因为2大于1和-4大于-7(:

+----+-------+
| ab | speed |
+----+-------+
|  1 |  -8.0 |
|  2 |  -7.0 |
|  2 |  -7.0 |
|  2 |  -4.0 |
|  2 |  -4.0 |
+----+-------+

在这种情况下,在struct(2,-4.0)中的最后一个结构,因此这是max函数的结果。
结构的字段名称是col1col2col3等,所以 struct(2,-4.0).col2-4.0。并以减去(与-1相同(与-struct(2,-4.0).col2中的4.0

最新更新