具有重复值的案例声明,Hadoop

时间:2019-01-24 06:49:46

标签: sql hive hue case-statement

我正在使用以零值注册一次,然后再附加一定金额的电子邮件地址。我可以使用case语句进行不同的电子邮件查询,但是我遇到的困难是,如果电子邮件的总金额为零,则在表的其余部分搜索该电子邮件,并使其值> 0,并将该电子邮件地址设为不同。

有什么建议吗?

样本数据: 具有两个字段的表-电子邮件和总金额

Email: abc@gmail.com | Gross Amt: $0    
Email: abc@gmail.com | Gross Amt: $50    
Email: xyz@gmail.com | Gross Amt: $0

所需的输出:

Email with 0 value: xyz@gmail.com    
Email with >0 value: abc@gmail.com

5 个答案:

答案 0 :(得分:1)

尝试以下操作-使用汇总和分组依据

Buffer

答案 1 :(得分:0)

您可以尝试使用条件聚合

config.local.php

答案 2 :(得分:0)

那就是挑战。仅需要将0值的电子邮件发送一次,但是如果它具有两个以上的值且一个为0,则丢弃0并考虑值> 0。

可能正在创建两个表,一个表为0,一个表为> 0,然后加入电子邮件地址?从表1中选择电子邮件和总金额1,如果从表1中选择总金额1 = 0,那么从表2中选择总金额= 2?

答案 3 :(得分:0)

您也可以尝试使用row_number()。

select email, grossamt from (select email, grossamt, row_number() over (partition email order by grossamt desc) as rnk from table) A where a.rnk=1

答案 4 :(得分:0)

您可以使用分析功能来做到这一点。请阅读查询中的注释:

select case when emailGrossAmt=0 then 'Email with 0 value'  
             when emailGrossAmt>0 then 'Email with > 0 value' 
          end as grp, 
        email, 
        GrossAMT
from
(
select  s.*,
        case when emailGrossAmt=0 then row_number() over(partition by email) else 1 end zero_rn --we need only one record with zeroAMT
from        
(
select email, GrossAMT, 
       sum(GrossAmt) over(partition by email) emailGrossAmt,
       dense_rank() over(partition by email order by case when GrossAmt=0 then 1 else 0 end)  rnk   --to pass all >0, they will have rnk=1       
from
( --replace this subquery(s) with your table
select stack(5,
'abc@gmail.com',0  ,
'abc@gmail.com',50 ,
'abc@gmail.com',500 ,
'xyz@gmail.com',0,
'xyz@gmail.com',0 ) as (email, GrossAMT)
) s --your table
) s 
where rnk=1
)s where zero_rn=1

结果:

Email with > 0 value    abc@gmail.com   500
Email with > 0 value    abc@gmail.com   50
Email with 0 value      xyz@gmail.com   0

除具有0数量的记录外,将返回所有emailGrossAmt> 0的行。 每封电子邮件中只有一封记录,其中emailGrossAmt = 0,返回了

也许它仍然可以优化,但是希望,你明白了