我在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
函数的结果。
结构的字段名称是col1
,col2
,col3
等,所以 struct(2,-4.0).col2
是-4.0
。并以减去(与-1相同(与-struct(2,-4.0).col2
中的4.0
。