oracle根據表中重復的數據生成重復的序列號


   oracle根據表中的數據生成序列號: 

   一般長這樣:

SELECT
    ROW_NUMBER () OVER (ORDER BY english DESC) seq,
    name,
    sex,
    englishFROM
   '英語成績表'

 

  但是產品說小明和小紅都是90分,憑什么小紅是第二名啊, 產品想要的效果是小紅小明並列第一

結果長這樣:

  

 

 

 

 

 

 

 

 

 

 

最后解決sql長這樣:

SELECT
    dense_rank() OVER (ORDER BY COUNT(*) DESC) seq,
    name,
        sex,
        english
FROM
    '英語成績表'

    

最后獻上百度的解釋:

row_number的用途非常廣泛,排序最好用它,它會為查詢出來的每一行記錄生成一個序號,依次排序且不會重復,注意使用row_number函數時必須要用over子句選擇對某一列進行排序才能生成序號。

rank函數用於返回結果集的分區內每行的排名,行的排名是相關行之前的排名數加一。簡單來說rank函數就是對查詢出來的記錄進行排名,與row_number函數不同的是,rank函數考慮到了over子句中排序字段值相同的情況,如果使用rank函數來生成序號,over子句中排序字段值相同的序號是一樣的,后面字段值不相同的序號將跳過相同的排名號排下一個,也就是相關行之前的排名數加一,可以理解為根據當前的記錄數生成序號,后面的記錄依此類推。

dense_rank函數的功能與rank函數類似,dense_rank函數在生成序號時是連續的,而rank函數生成的序號有可能不連續。dense_rank函數出現相同排名時,將不跳過相同排名號,rank值緊接上一次的rank值。在各個分組內,rank()是跳躍排序,有兩個第一名時接下來就是第三名,dense_rank()是連續排序,有兩個第一名時仍然跟着第二名。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM