Case Case с повторяющимися значениями, Hadoop - PullRequest
0 голосов
/ 24 января 2019

Я работаю с адресами электронной почты, которые зарегистрировались один раз с нулевым значением, а затем снова с определенной суммой.Я могу сделать отдельный запрос по электронной почте с помощью оператора 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 голосов
/ 24 января 2019

Вы можете сделать это, используя аналитические функции.Пожалуйста, прочитайте комментарии в запросе:

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

Возвращаются все строки с emailGrossAmt> 0, кроме записей с количеством 0.Возвращается только одна запись по электронной почте с emailGrossAmt = 0

Возможно, она все еще может быть оптимизирована, но, надеюсь, у вас есть идея

0 голосов
/ 24 января 2019

вы также можете попробовать использовать 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
0 голосов
/ 24 января 2019

Попробуйте ниже - с помощью агрегации и группировки по

select email, sum(amount)
from tablename
group by email
0 голосов
/ 24 января 2019

Это проблема.Требуется электронное письмо со значением 0 только один раз, но если оно имеет более двух значений и одно равно 0, тогда отбрасывать 0 и учитывать значение> 0.

Возможно создание двух таблиц, одна с 0 и одна с> 0s, а потом присоединение по адресу электронной почты работает?Выберите адрес электронной почты и сумму брутто1 из таблицы1, если сумма брутто1 = 0 из таблицы1, то выберите сумму брутто = 2 из таблицы2?

0 голосов
/ 24 января 2019

Вы можете попробовать использовать условное агрегирование

select email,
sum(case when t1.GrossAmt=0 then 1 end) total
sum(case when t1.GrossAmt> then GrossAmt end) 
from table_name 
group by email
...