如果我把3个名字放在一行:
科瓦茨·阿尔伯特,科瓦茨·达维德,纳吉·巴拉兹
Surename是Kovács,Nagy
FamilyName是阿尔伯特,达维德,巴拉兹
如果我对Familyname运行rank()解析函数,输出会是什么?
1-Kovács Albert
1-Kovács Dávid
3-Nagy Balázs或
1-Kovács Dávid
1-Kovács Albert
3-Nagy Balázs或者它会是随机的?
我没有在我的电脑上安装甲骨文,如果你能给我一些在线免费学习实例,我将不胜感激…
发布于 2012-03-18 06:30:37
如果您在Familyname上执行这样的查询。输出将如下所示:
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如果您在SureName和order by FamilyName上执行RANK。输出将如下所示:
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发布于 2012-03-18 06:53:32
这完全取决于你想要什么。要获得您建议的结果,您的分析子句必须为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子句的示例。如果我们将其应用于您的查询,按surname分区并按familyname排序,您的查询和结果集可能如下所示。
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这意味着我们对每个姓氏的所有姓氏分别进行排名。因为达维德在追逐阿尔伯特,所以他在科瓦奇的姓氏中的排名是2。请注意,在没有特定order by的情况下,不需要对结果集进行排序。
https://stackoverflow.com/questions/9754262
复制相似问题