如果我连续放3个名字:
KovácsAlbert,KovácsDávid,NagyBalázs
Surename是Kovács,Nagy
FamilyName是Albert,Dávid,Balázs
如果我将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
或者它是随机的吗?
我的计算机上没有安装oracle,如果你能给我一些在线免费学习实例,我会很感激...
答案 0 :(得分:2)
如果您在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
如果您在RANK
和SureName
上执行order 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
答案 1 :(得分:0)
这完全取决于你想要什么。要获得任何一个建议的结果,您的分析子句必须是rank() over ( order by surname )
。此查询按照rank
升序的顺序为您提供每条记录的surname
。由于你有两个姓氏相同的人,那么这两个人的顺序理论上是随机的。这是因为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
这意味着我们会为每个姓氏单独列出所有姓氏。由于Dávid在Albert之后,他在Kovács的姓氏中获得了2分。请注意,如果没有特定的order by
,则不需要对结果集进行排序。