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 排名查询的主要内容,如果未能解决你的问题,请参考以下文章

如何查询数据库中排名前几位的数据

SQL(MySQL + PHP) 查询,查询排名,表内一个人多条数据,查出最大的那条排名,请问!

如何让 sql 排名查询工作以查找特定 id 的排名

SQL 怎样查询 单科成绩排名第3名的学生?

oracle根据成绩排名查询某个名次段的人员

SQL 查询获取主选择查询上的行排名或位置