1、row_number() over()排序功能:
(1) row_number() over()分組排序功能:
在使用 row_number() over()函數時候,over()里頭的分組以及排序的執行晚於 where group by order by 的執行。
partition by 用於給結果集分組,如果沒有指定那么它把整個結果集作為一個分組,它和聚合函數不同的地方在於它能夠返回一個分組中的多條記錄,而聚合函數一般只有一個反映統計值的記錄。
例如:employee,根據部門分組排序。
SELECT empno,WORKDEPT,SALARY, Row_Number() OVER (partition by workdept ORDER BY salary desc) rank FROM employee -------------------------------------- A00 152750 1 A00 66500 2 A00 49250 3 A00 46500 4 A00 39250 5 B01 94250 1 C01 98250 1 C01 73800 2
(2)對查詢結果進行排序:(無分組)
SELECT empno,WORKDEPT,SALARY, Row_Number() OVER (ORDER BY salary desc) rank FROM employee -------------------------------------- A00 152750 1 C01 98250 2 D21 96170 3 B01 94250 4 E11 89750 5 E21 86150 6 E01 80175 7 C01 73800 8 D11 72250 9
row_number() over()和rownum差不多,功能更強一點(可以在各個分組內從1開時排序).
2、rank() over()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內).
select workdept,salary,rank() over(partition by workdept order by salary) as dense_rank_order from emp order by workdept; ------------------ A00 39250 1 A00 46500 2 A00 49250 3 A00 66500 4 A00 152750 5 B01 94250 1 C01 68420 1 C01 68420 1 C01 73800 3
3、dense_rank() over()是連續排序,有兩個第二名時仍然跟着第三名。相比之下row_number是沒有重復值的 .
select workdept,salary,dense_rank() over(partition by workdept order by salary) as dense_rank_order from emp order by workdept; ------------------ A00 39250 1 A00 46500 2 A00 49250 3 A00 66500 4 A00 152750 5 B01 94250 1 C01 68420 1 C01 68420 1 C01 73800 2 C01 98250 3
使用ROW_NUMBER刪除重復數據
---假設表TAB中有a,b,c三列,可以使用下列語句刪除a,b,c都相同的重復行。
DELETE FROM (select year,QUARTER,RESULTS,row_number() over(partition by YEAR,QUARTER,RESULTS order by YEAR,QUARTER,RESULTS) AS ROW_NO FROM SALE ) WHERE ROW_NO>1
最后在執行hive 語句時出錯, 出現錯誤:
FAILED: ParseException line 22:7 extraneous input '10' expecting EOF near ''
有看到解釋說是,原因是:
sql語句中多了分號。。。
執行腳本時需要在sql后面添加分號,但是調用jdbc執行sql語句時,不可以在語句用分號結束。
但依舊沒有解決問題。
轉自:https://www.cnblogs.com/alsf/p/6344197.html