Oracle SQL 排名查询
Posted
技术标签:
【中文标题】Oracle SQL 排名查询【英文标题】:Oracle SQL rank query 【发布时间】:2018-08-25 04:57:57 【问题描述】:我需要帮助解决我的一个问题。
这是要求:- 我必须报告当前审核日期与上次审核日期之间的差异在 365 天和 455 天之间的记录。然而,这里的问题是我的客户表只有一列用于年度审查日期。所以我必须检查历史表来找到当前的年度审查日期,在下面的例子中是 30/04/2019,最后审查日期是 30/04/2018。 如何为每条记录仅获取 1 个行项目?
下面是我的表的样子,RNK 列是一个计算列,用于确定每条记录的排名,其余列来自表。请帮忙!我使用 Oracle 12c。
【问题讨论】:
请不要将表格发布为图片。使用CREATE TABLE
语句显示其结构,使用INSERT INTO
语句显示示例数据。还要根据样本数据发布预期结果,最好以表格文本格式发布。还请包括您已有的查询,再次作为纯文本,而不是作为图像。如果您混淆 ID,它几乎没有用,因为它们似乎对构建组至关重要。如果您有无法或不想发布的敏感数据,请创建一组模型数据来说明问题。请相应地编辑您的问题。
目前的审核日期是如何定义的?这总是 2018-04-30 修复吗?
请显示您想要的结果。
【参考方案1】:
您可以将row_number()
分析函数用于您的rnk
列,如以下select 语句:
select row_number() over (partition by annual_review_date order by update_date) as rnk,
t.*
from tab t;
【讨论】:
【参考方案2】:如果我理解正确,你可以使用dense_rank()
:
select t.id, max(annual_review_dt) as latest_ard,
min(annual_review_dt) as prev_ard
from (select t.*,
dense_rank() over (partition by id order by annual_review_dt) as seqnum
from t
) t
where seqnum in (1, 2);
【讨论】:
我最初使用的是 SELECT * FROM (SELECT RANK () OVER (PARTITION BY a.id, a.annuaL_review_dt ORDER BY update_dt DESC, Annual_review_dt) AS rnk, a.* FROM t a WHERE a.annuaL_review_dt不为空且 a.stat_ind = 1以上是关于Oracle SQL 排名查询的主要内容,如果未能解决你的问题,请参考以下文章