工作上遇到的问题,这边复现记录下处理的方法。假设有如下数据:
id | value |
111 | 99, 60, 55 |
222 | 90, 102, 99 |
现在有这样的需求:如果字段value中,有任意一个值大于100,那么就要把这条数据筛选出来。
解决方法的思路如下:
先把value字段用explode炸出来,结果如下
id | value |
111 | 99 |
111 | 60 |
111 | 55 |
222 | 90 |
222 | 102 |
222 | 99 |
可以看到id为222的value为102,大于100,是需要把整个222id的数据筛选出来的。那么如何操作可以把整个222的数据筛选出来而不是只掉上面222、102那一行的数据呢?
第一步:可以对explode之后的每行数据打标签,if(value>100,1,0) as tag
第二步:对id进行group by求和,sum(tag) as tag_sum
第三步:tag_num>0的就过滤掉不满足条件的了,where tag_sum > 0
完整的sql如下:
select
id
,value
from
(
select
id
,value
,sum(tag) as tag_sum
from
(
select
id
,value
,if(value_new>100,1,0) as tag
from
(
select
id
,value
,value_new
from table_xxx
lateral view explode(split(value,',')) tb as value_new
) a
) b
group by
id
,value
) c
where tag_sum > 0