sql - Oracle 自连接从每个分区的最小值开始
问题描述
我有这张桌子:
COL1 COL2 COL3
--------------------
A 1 VAL1
A 2 VAL2
A 4 VAL3
B 2 VAL4
B 4 VAL5
B 5 VAL6
我想获得这个输出:
COL1 COL2 COL3
--------------------
A 1 VAL1
A 2 VAL2
A 3 NULL
B 2 VAL4
B 3 NULL
B 4 VAL6
逻辑:
对于 COL1 的每个分区,取最小的 COL2 值,取以下 3 个数字,如果第一个表中存在 COL1 和 COL2 的组合,则显示 COL3,否则显示 NULL。
解决方案
“递归 WITH 子句”的另一种解决方案
With rws_numbered (COL1, COL2, COL3, rn) as (
select COL1, COL2, COL3
, row_number()over(order by col1, col3) rn
from Your_table
)
, cte ( COL1, COL2, COL3, rn ) as (
select COL1, COL2, COL3, rn
from rws_numbered
where rn = 1
union all
select
t.COL1
, case when t.col1 = c.col1 then c.col2 + 1 else t.col2 end COL2
, t.COL3
, t.rn
from rws_numbered t
join cte c
on c.rn + 1 = t.rn
)
select COL1, COL2, case when exists (select null from Your_table t where t.COL1 = cte.COL1 and t.COL2 = cte.COL2) then COL3 else null end COL3
from cte
order by 1, 2
;
推荐阅读
- openssl - /usr/sib/sshd:重定位错误:符号 EVP_KDF_ctrl 版本 OPENSSL_1_1_1b 未在带有链接时间参考的文件 libcrypto.so.1.1 中定义
- javascript - 如何获取输入类型=图像的值并将其显示在图像上?
- javascript - 下拉菜单停留在同一个地方
- python - TypeError:Unicode 对象必须在哈希库函数中散列之前进行编码
- java - 在弹性搜索中索引大型数据集会导致 java.net.SocketTimeoutException: 30,000 毫秒超时连接 http-outgoing-223 错误
- ios - 使用 UIHostingController 将值从 SwiftUI 传递到 UIViewController
- php - 将数据从 PHP 发送到活动的 Python 3 服务器脚本
- javascript - 如何在地球引擎Javascript中将列表索引转换为整数
- angular-cli - 使用 Angular CLI 创建新项目
- java - 单个类是否可以扩展整个包?