Oracle Rank()分析函数

时间:2012-03-17 22:16:51

标签: sql oracle rank

如果我连续放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,如果你能给我一些在线免费学习实例,我会很感激...

2 个答案:

答案 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

如果您在RANKSureName上执行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,则不需要对结果集进行排序。