根据列值排名/计数行

时间:2012-05-16 17:02:39

标签: sql oracle analytic-functions

我有一些数据采用此sqlfilddle中描述的格式:http://sqlfiddle.com/#!4/b9cdf/2

基本上是一个包含用户ID和事件发生时间的表。我想做的是根据用户发生的时间来计算事件。所以,表格看起来像:

UID    Timestamp
-----------------
01     01-APR-12
01     01-APR-12     
02     02-APR-12     
03     05-APR-12     
01     10-APR-12     
02     11-APR-12     
03     15-APR-12     
01     20-APR-12     

我希望这可以根据事件发生的顺序为事件分配数字等级。所以,这意味着上面的表格会变成:

UID    Timestamp     Rank
--------------------------
01     01-APR-12     1
02     02-APR-12     1
03     05-APR-12     1
01     10-APR-12     2
02     11-APR-12     2
03     15-APR-12     2
01     20-APR-12     3

有没有办法在Oracle SQL中执行此操作?或者我是否必须将它吐出来用脚本语言并从那里拿出来?

谢谢!

2 个答案:

答案 0 :(得分:3)

看起来您需要分析函数rank

SELECT uid, timestamp, rank() over (partition by uid order by timestamp) rnk
  FROM your_table

如果可以存在关联(两行具有相同的UIDTimestamp),那么,根据您想要处理关系的方式,您可能需要dense_rank或{{1而是分析函数。

答案 1 :(得分:-1)

万一其他人遇到此问题,RANK,DENSE_RANK,ROW_NUMBER也可以在MSSQL中使用。