hive 去掉重复数据,仅显示需要一条

select count(1)
    ,count(distinct student_no)
from(
    select cj.student_no
        ,if(cj.kpi_year<'2018/08','2018年8月前',kpi_year) as contract_year
        ,row_number() over (partition by cj.student_no order by cj.kpi_year desc)as num
    from hf_mobdb.contract_joint cj
    )hcj
where hcj.num=1

使用row_number() over

或者直接先排序再distinct,默认留第一条记录

有很多数据带有时间戳,例如行为日志,一般来说一个id就确定了一个用户主体,例如我只想取这个用户的一条记录、明确来说是最近的一条行为记录,用distinct就没法做了
思路肯定是将id相同的所有记录按照时间发生的顺序倒排取最后一条,group by、order by 、limit 1
 

 

一、distinct,group by与ROW_Number()窗口函数使用方法

1. Distinct用法:对select 后面所有字段去重,并不能只对一列去重。

(1)当distinct应用到多个字段的时候,distinct必须放在开头,其应用的范围是其后面的所有字段,而不只是紧挨着它的一个字段,而且distinct只能放到所有字段的前面

(2)distinct对NULL是不进行过滤的,即返回的结果中是包含NULL值的

(3)聚合函数中的DISTINCT,如 COUNT( ) 会过滤掉为NULL 的项

2.group by用法:对group by 后面所有字段去重,并不能只对一列去重。

3. ROW_Number() over()窗口函数

注意:ROW_Number() over (partition by id order by time DESC) 给每个id加一列按时间倒叙的rank值,取rank=1

select m.id,m.gender,m.age,m.rank

from (select id,gender,age,ROW_Number() over(partition by id order by id) rank

      from temp.control_201804to201806

      where id!=’NA’ and gender!=” or age!=”

           ) m

where m.rank=1

    原文作者:unorth
    原文地址: https://blog.csdn.net/zjjnorth/article/details/105218020
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞