sql - 如何:Oracle 解析函数返回行
问题描述
我想我的问题可以用 SQL 中的 Oracle 分析函数来回答,但我不确定。假设我有以下“文档”数据库表:
- Rank:逆序,每个文档都有自己的顺序,最新的文档修订号最低(0)
- 修订:每个文档的字母数字序列,最新文档修订具有最高修订 ID
姓名 | 秩 | 修订 | 状态 |
---|---|---|---|
文件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 查询以返回此结果集。非常感谢!
解决方案
像这样的东西?
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>
推荐阅读
- python - 计算每类的词频
- javascript - Select2 下拉搜索正在消失/未找到结果
- reactjs - 反应迭代 json api 到 setState 变量
- python - 附加维度 numpy 数组
- php - 在 Laminas API 工具中使用 Zend Framework 1 库 - 自动加载供应商前缀类
- windows - 检查添加到 ssh 代理的密钥
- scroll - 如何在 Emacs 中平滑滚动?
- c# - 实体框架 SqlQuery 无故失败 (ObjectDisposedException)
- python - 计算每个元素及其邻居的总和时缺少一项
- cypress - 赛普拉斯 - Windows - 出现错误“npm ERR!在 cypress@6.1.0 安装后脚本失败。”