2012-03-17 119 views
0

如果我把三個名字在列:甲骨文排名()解析函數

阿爾伯特

史密斯,大衛·史密斯,鮑拉高

Surename還史密斯,大

FamilyName阿爾伯特·大衛·巴拉茲

如果我運行rank()分析功能Familyname,輸出將是什麼呢?

1-Kovács Albert 
1-Kovács Dávid 
3-Nagy Balázs 

OR

1-Kovács Dávid 
1-Kovács Albert 
3-Nagy Balázs 

還是會隨機的?

我沒有甲骨文在安裝到我的電腦,如果你能給我一些免費的在線學習情況,如果你做這樣的查詢上Familyname我將不勝感激......

+0

僅供參考 - 你可以下載,如果你想要做一些真正的測試,免費安裝Oracle XE。 – 2012-03-18 03:52:54

回答

2

。輸出將是這樣的:

1-Kovács Albert 
1-Kovács Dávid 
1-Nagy Balázs 

與此查詢:

SELECT 
    RANK() OVER(PARTITION BY FamilyName ORDER BY FamilyName) AS iRank, 
    Surename, 
    FamilyName 
FROM 
    Table1 

如果你做一個RANKSureNameorder by FamilyName。輸出將是這樣的:

1-Kovács Albert 
2-Kovács Dávid 
1-Nagy Balázs 

與此查詢:

SELECT 
    RANK() OVER(PARTITION BY Surename ORDER BY FamilyName) AS iRank, 
    Surename, 
    FamilyName 
FROM 
    Table1 
+0

我相信你應該說的名字或名字,而不是SureName。這會讓示例更易於閱讀 – 2016-05-12 09:16:30

0

這完全取決於你想要什麼。無論是讓你對你的建議條款的分析結果將不得不rank() over (order by surname)。這爲您提供在他們surname的升序排列每個記錄的查詢rank。當你有兩個人同姓那麼這兩個人理論上應該隨機的順序。因爲這是不rank()其實做的結果集的任何排序,你需要一個order by子句來做到這一點;或者至少保證,對結果你想要的。

喜歡的東西:

select rank() over (order by surname asc, familyname asc) as rnk 
    , surname, familyname 
    from my_table 
order by rank() over (order by surname asc, familyname asc) 

該查詢以升序姓和名的順序返回姓,姓和排名。訂購的結果集的排名也意味着傷害它應該是這樣的:

1 | Kovács | Albert 
2 | Kovács | Dávid 
3 | Nagy | Balázs 

這是利益,並與解析函數的問題,你想要做的事情,你可以在大量具體的,但如果你你想,你必須在你運行的精確查詢傷害一個明確的答案。

documentation提供了使用partition by子句另一個例子。如果我們這個由familyname適用於您的查詢,通過surname劃分和排序您的查詢,結果集可能看起來像這樣。

select rank() over (partition by surname order by familyname asc) as rnk 
    , surname, familyname 
    from my_table 

2 | Kovács | Dávid 
1 | Kovács | Albert 
1 | Nagy | Balázs 

這意味着,我們的排名全部familynames每個單獨的姓氏。大衛是阿爾伯特後,他得到的秩2中的姓科瓦奇。需要注意的是,沒有具體的order by有對於不要求結果集進行排序。