我正在蜂巢中的桌子上工作,数十亿行和超过一百列。合并大量列
我需要合并100列中的第一个非零值。我能够做到这一点,但它涉及许多代码行(每列一行)。我还必须创建另一列,以相同的方式查找最后一个非零值,这意味着至少有另一个值。每列具有相同的命名约定,以便balance0,balance1,balance2等。
我想知道如果使用较少的代码行有更好的方法?我搜索了网页,可以找到很多关于凝聚价值的信息,但我似乎找不到任何有助于削减所需编码行数的内容。
我正在使用的代码的简化版本低于:
SELECT urn
,COALESCE(IF(balance0 <> '0', balance0, NULL)
,IF(balance1 <> '0', balance1, NULL)
,IF(balance2 <> '0', balance2, NULL)
,IF(balance3 <> '0', balance3, NULL)
,IF(balance4 <> '0', balance4, NULL)
,IF(balance5 <> '0', balance5, NULL)
,IF(balance6 <> '0', balance6, NULL)
,IF(balance7 <> '0', balance7, NULL)
,IF(balance8 <> '0', balance8, NULL)
,IF(balance9 <> '0', balance9, NULL)
,IF(balance10 <> '0', balance10, NULL)
,IF(balance11 <> '0', balance11, NULL)
,IF(balance12 <> '0', balance12, NULL)
,IF(balance13 <> '0', balance13, NULL)
,IF(balance14 <> '0', balance14, NULL)
,IF(balance15 <> '0', balance15, NULL)
,IF(balance16 <> '0', balance16, NULL)
,IF(balance17 <> '0', balance17, NULL)
,IF(balance18 <> '0', balance18, NULL)
,IF(balance19 <> '0', balance19, NULL)
,IF(balance20 <> '0', balance20, NULL)
,IF(balanceX.... etc to balance100
)
AS first_positive_balance
FROM table_x;
非常感谢你提前为任何帮助!
如果您需要这样做,那么您的数据库几乎肯定会布置得很差。您的余额应该存储在自己的表格中。 – meagar
@meagar。是的,我同意这不是最好的布局。实际上,在真正的表格中,每个平衡都包含在单个列中的data_struct的元素中。如果我在列的上下文中而不是数据结构的元素中提问,我只是认为这个问题与更多人有关。我不知道它为什么按照它的方式进行布局,但你是对的,它当然可以做得更好。我相信这些数据在加载到Hadoop之前最初来自传统的大型机系统。 – data101