首页 > 解决方案 > 如何:Oracle 解析函数返回行

问题描述

我想我的问题可以用 SQL 中的 Oracle 分析函数来回答,但我不确定。假设我有以下“文档”数据库表:

姓名 修订 状态
文件A 0 5b 只读
文件A 1 5a 草稿
文件A 3 3 只读
文件A 4 2 草稿
文件A 2 4 发表
文件A 5 1 发表
文件B 0 2 草稿
文件B 1 1 发表
文件C 0 1 发表

请求的结果集:每个文档的最新发布版本

给我,对于每个文档,最新发布的文档,具有最低的排名号

由于最新的文档修订版可能处于状态草稿中,因此它并不总是 0

姓名 修订 状态
文件A 2 4 发表
文件B 1 1 发表
文件C 0 1 发表

请制定 SQL 查询以返回此结果集。非常感谢!

标签: sqloracleanalytic-functions

解决方案


像这样的东西?

SQL> with test (name, rank, revision, state) as
  2    (select 'A', 0, '5b', 'ReadOnly'  from dual union all
  3     select 'A', 2,  '4', 'Published' from dual union all
  4     select 'A', 5,  '1', 'Published' from dual union all
  5     select 'B', 0,  '2', 'Draft'     from dual union all
  6     select 'B', 1,  '1', 'Published' from dual union all
  7     select 'C', 0,  '1', 'Published' from dual
  8     )
  9  select name, rank, revision, state
 10  from (select t.*,
 11          rank() over (partition by name order by revision desc, rank) rn
 12        from test t
 13        where state = 'Published'
 14       )
 15  where rn = 1;

N       RANK RE STATE
- ---------- -- ---------
A          2 4  Published
B          1 1  Published
C          0 1  Published

SQL>

推荐阅读