根据列值对行进行排名/计数
Posted
技术标签:
【中文标题】根据列值对行进行排名/计数【英文标题】:Ranking/Counting Rows based on Column Value 【发布时间】:2012-05-16 17:02:39 【问题描述】:我有一些数据的格式在这个 sqlfileddle 中描述: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 中做到这一点?还是我必须将其转换为脚本语言并从那里获取?
谢谢!
【问题讨论】:
我认为你需要一个光标 我就是这么想的。我从来没有写过游标循环,并且很难找到关于如何在考虑到这种类型的目标的情况下这样做的文档。有什么建议吗? 【参考方案1】:看起来你想要解析函数rank
SELECT uid, timestamp, rank() over (partition by uid order by timestamp) rnk
FROM your_table
如果可能存在平局(两行具有相同的UID
和Timestamp
),则根据您要如何处理平局,您可能需要dense_rank
或row_number
分析函数。
【讨论】:
天哪,这太完美了。谢谢您的帮助。我知道在某个地方有一个分析函数可以完全按照我的要求做,但是我来自 mysql/MSSQL 的世界,我不习惯内置我需要的答案。再次感谢!【参考方案2】:以防万一其他人遇到这种情况,在 MSSQL 中也可以使用 RANK、DENSE_RANK、ROW_NUMBER。
【讨论】:
这个问题根本与Oracle无关。以上是关于根据列值对行进行排名/计数的主要内容,如果未能解决你的问题,请参考以下文章