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()