通过按降序分配值来循环配置单元或sql行

t5zmwmid  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(258)

对于具有5行的配置单元或sql表,如何拆分值=12,并按降序将其分配给行。例如,如下表所述,其中列(total)之和为12,值按降序分配。

column_1    column_2    total
   a           b          3
   c           d          3
   e           f          2
   g           h          2
   i           j          2
nx7onnlm

nx7onnlm1#

可以使用hivevar变量参数化此查询。我用total=12,11,16这几个不同的值来测试它,它似乎工作正常。请自行优化调试。我只是提供了一个想法:

with vars as(--calculate min_value, max_value and how many rows with max_value it should be (max_rows)
select
       ceil(total/num_rows)                 as max_value, 
       floor(total/num_rows)                as min_value,
       total-floor(total/num_rows)*num_rows as max_rows
from
(select 5 num_rows, 12 total)s --your variables, parametrize using hivevar variables
),

your_table as (--use your table instead of this
select stack(5,
   'a', 'b',
   'c', 'd',
   'e', 'f',
   'g', 'h',
   'i', 'j'
) as (column_1,column_2)
)-- this is your_table, suppose column_1 determines the order of rows

select column_1,column_2, case when rn<=max_rows then max_value else min_value end as total
       --, rn, min_value, max_value, max_rows --debug values
from
(
select t.*, row_number() over(order by column_1) rn,  
       v.min_value, 
       v.max_value, 
       v.max_rows
 from your_table t
      cross join vars v
)s;

结果:

column_1    column_2    total   
a   b   3   
c   d   3   
e   f   2   
g   h   2   
i   j   2

如果total=11,则返回:

column_1    column_2    total   
a   b   3   
c   d   2   
e   f   2   
g   h   2   
i   j   2

如果total=16,则返回:

column_1    column_2    total   
a   b   4   
c   d   3   
e   f   3   
g   h   3   
i   j   3

当然,它仍然可能存在一些缺陷,需要在用作核React堆控制组件之前进行仔细测试。未使用初始表中不同的行数进行测试。但在你的问题中,它确实适用于初始条件。
也可以通过计算行数进行优化 count(*) over() as num_rows 在表的查询中,只对一个参数进行参数化:total(在示例中是12)。计算max\u value、min\u value和max\u行的逻辑可以从\u表移到同一个查询中,不需要交叉联接,也可以不需要vars子查询。

相关问题