sparksql:去重row_number,生成排序序號 :RANK, DENSE_RANK, ROW_NUMBER的區別

https://blog.csdn.net/qq_39869388/article/details/80422472

去重:

select date,phone from (select *,row_number() over (partition by phone order by date) num from tmp_table1) t where t.num=1

第一步:select *,row_number() over (partition by phone order by date) num from tmp_table1 

按照phone 去重,date排序

第二步:num=1 

就是留下num=1 的數據,起到去重

 

生成排序:

場景是需要基於xx字段排序,生成序列號,也用row_number

select *,row_number() over (order by date) num from tmp_table1 

https://blog.csdn.net/weixin_42379136/article/details/86675049

RANK, DENSE_RANK, ROW_NUMBER都是把表中的行按分區內的排序標上序號,但有一點差別:

RANK:可以生成不連續的序號,比如按分數排序,第一第二都是100分,第三名98分,那第一第二就會顯示序號1,第三名顯示序號3。

DENSE_RANK: 生成連續的序號,在上一例子中,第一第二並列顯示序號1,第三名會顯示序號2。

ROW_NUMBER: 顧名思義就是行的數值,在上一例子中,第一第二第三將會顯示序號爲1,2,3。

 

下面的例子幫助理解,按年級分組,分數降序排列,分別新建列RANK, DENSE_RANK, ROW_NUMBER:
考試成績排名
姓名    年級    分數    RANK    DENSE_RANK    ROW_NUMBER
張三    一年級    100    1    1    1
李四    一年級    100    1    1    2
王五    一年級    98    3    2    3
小明    二年級    100    1    1    1
小芳    二年級    95    2    2    2
小民    二年級    90    3    3    3
 

sparkSession.sql("SELECT * , " +
      "RANK() OVER (PARTITION BY grade ORDER BY score DESC) AS rank, " +
      "DENSE_RANK() OVER (PARTITION BY grade ORDER BY score DESC) AS dense_rank, " +
      "ROW_NUMBER() OVER (PARTITION BY grade ORDER BY score DESC) AS row_number " +
      "FROM ScoreDetail").show()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章