我有一个如下的表:
+-------+------+
|ID |lang |
+-------+------+
|1 |eng |
|1 |pol |
|2 |eng |
|3 |gro |
|3 |eng |
+-------+------+
我想只保留那些行,如果ID重复,我会保留非“eng”行,因此,例如,我想:
+-------+------+
|ID |lang |
+-------+------+
|1 |pol |
|2 |eng |
|3 |gro |
+-------+------+
有没有一个快速简洁的方法可以做到这一点?
不知道如何去做这在一个很好的方式来实现上述结果!我正在使用Hive
2条答案
按热度按时间nkoocmlb1#
如果每个id需要一行,那么使用row_number(),partition by id,order by case语句,在该语句中可以有一些自定义的排序逻辑。
例如,下面的row_number将标记rn=1的任何第一个非eng(随机)行(每个ID),相同ID的任何其他行将标记为〉1:2、3、4......并且您可以只筛选那一行。如果您希望优先选择某些语言,请在case表达式中添加更多的case,以便根据语言进行排序,或者您可以在order by中添加其他列或表达式。
如果你需要保留同一个id的所有行,但不是'eng',使用
dense_rank()
或rank()
代替row_number()
,并与上面的over()相同,它会为每个id的lang!='eng'的所有行赋值1。1u4esq0p2#