hive[error 10025]:表达式不在按键名分组中

ne5o7dgx  于 2021-06-25  发布在  Hive
关注(0)|答案(2)|浏览(308)

我正在尝试选择由组中的变量中的关键字定义的记录。
name是一个包含关键字的字符串。
组由id1和id2的组合定义。
我对按包含关键术语的组提取记录感兴趣。

select id1, id2, name
   case
    when name LIKE '%LOAD_TIME' then 1
    when name LIKE '%LOGIN_SESSION_TIME' then 1
   end as b_flag
   from df1
   group by id1, id2
   having (sum(b_flag) > 0 )

df1型:

id1  id2  name                               
1     1    xxxLOAD_TIME
1     1    xxxLOGIN_LOGIN_SESSION_TIMExxx
1     1    xxxxSome other timexxxx
2     2    xxSome other timex
3     1    xxxLOAD_TIME
3     1    xxSome other timexx

在创建bÈflag之后,新的数据集应该如下所示:

id1  id2  name                             b_flag   
1     1    xxxLOAD_TIME                      1
1     1    xxxLOGIN_LOGIN_SESSION_TIMExxx    1
1     1    xxxxSome other timexxxx   
2     2    xxSome other timex
3     1    xxxLOAD_TIME                      1
3     1    xxSome other timexx

期望输出:

id1  id2  name                             b_flag   
    1     1    xxxLOAD_TIME                      1
    1     1    xxxLOGIN_LOGIN_SESSION_TIMExxx    1
    1     1    xxxxSome other timexxxx   
    3     1    xxxLOAD_TIME                      1
    3     1    xxSome other timexx

我看不出我的代码有什么问题,但我也遇到了同样的错误:
[错误10025]:表达式不在按键名分组中
谢谢你的帮助

wvt8vs2t

wvt8vs2t1#

您可以使用窗口函数执行此操作:

select id1, id2, name, b_flag
from (
    select 
        t.*, 
        case when name LIKE '%LOAD_TIME' or name LIKE '%LOGIN_SESSION_TIME' then 1 end b_flag,
        sum(case when name LIKE '%LOAD_TIME' or name LIKE '%LOGIN_SESSION_TIME' then 1 end) 
            over(partition by id1, id2) sum_b_flag
    from mytable t
) t
where sum_b_flag > 0

内部查询检查当前行是否与条件匹配,并对具有相同条件的记录计算标志的窗口和 (id1, id2) .
如果不想重复计算标志的表达式,可以使用其他子查询:

select id1, id2, name, b_flag
from (
    select t.*, sum(b_flag) over(partition by id1, id2) sum_b_flag
    from (
        select 
            t.*, 
            case when name LIKE '%LOAD_TIME' or name LIKE '%LOGIN_SESSION_TIME' then 1 end b_flag,
        from mytable t
    ) t
) t
where sum_b_flag > 0
wmvff8tz

wmvff8tz2#

尝试

select 
    main.id1, 
    main.id2, 
    main.name,
    case
        when main.name LIKE '%LOAD_TIME' then 1
        when main.name LIKE '%LOGIN_SESSION_TIME' then 1
    end as b_flag
from 
    df1 main
    left semi join (
        select distinct id1, id2 from df1 
        where (case
            when name LIKE '%LOAD_TIME' then 1
            when name LIKE '%LOGIN_SESSION_TIME' then 1
        end)=1 ) f 
on main.id1=f.id1 and main.id2=f.id2

相关问题