gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:08:55 26 4
gpt4 key购买 nike

我在 Oracle 数据库中有一个表 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).col24.0

关于oracle - 如何在Hive中实现Oracle的 "func(...) keep (dense_rank ...)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44385551/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com