2012-03-17 121 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有对于不要求结果集进行排序。