我在Oracle中生成了下表:
| 字段_x|字段_y|西瓜|橙子|卷心菜|
| - ------|- ------|- ------|- ------|- ------|
| 洛雷姆|伊普苏姆|四个|第二章|五个|
| 悲痛|坐|九|无|七|
| 阿梅特|精英|六个|九|1个|
我想将其改为:
| 字段_x|字段_y|果实|
| - ------|- ------|- ------|
| 洛雷姆|伊普苏姆|卷心菜|
| 悲痛|坐|西瓜|
| 阿梅特|精英|橙子|
基本上,最后三列的名称根据它们在哪一行中具有最大值而合并成一列(第1行具有最大卷心菜,第2行具有最大西瓜,第3行具有最大橙子)。请记住,如果其中一列具有最大值,则它应该被另一列的最大值覆盖,如果另一列的最大值最高(请参见第2行中的西瓜和卷心菜)。
我认为“CASE”语句是可能的,但我想知道是否有更有效的方法来这样做。
3条答案
按热度按时间dba5bblo1#
可以使用
CASE
表达式:其中,对于示例数据:
输出:
| 字段_X|字段_Y|水果|
| - ------|- ------|- ------|
| 洛雷姆|伊普苏姆|卷心菜|
| 悲痛|坐|西瓜|
| 阿梅特|精英|橙|
如果可以有多个最大值,则:
如果不想使用
CASE
表达式,可以先使用UNPIVOT
,然后进行聚合(但效率会降低):| 字段_X|字段_Y|水果|
| - ------|- ------|- ------|
| 阿梅特|精英|橙|
| 悲痛|坐|西瓜|
| 洛雷姆|伊普苏姆|卷心菜|
fiddle
n9vozmp42#
一个选项是使用MODEL子句:
...其中包含您的示例数据:
...结果:
......对于MTO评论中提到的情况----模型条款非常灵活,因此可以调整以处理10以上的值。在这种情况下,可以修改规则以检查数值:
......最初的答案(如前所述)是针对问题中提供的样本数据。可能会有更多的问题,如如果两个水果在行中具有相同的最大值会怎样?可能会有更多的问题(如往常一样),但模型子句是非常可调的,快速和可靠的。
ma8fv8wu3#
使用
unpivot
和row_number
的替代解决方案如果您只想输出一个值,此解决方案允许控制连接的顺序和选择。参见
row_number
的order by
子句此查询还适用于 fruit 列可为空的情况,此时使用Oracle
greatest
函数的解决方案将无法返回null
。