首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Oracle -两列上的差距和孤岛

Oracle -两列上的差距和孤岛
EN

Stack Overflow用户
提问于 2019-02-01 20:46:04
回答 1查看 61关注 0票数 1

初始数据:

代码语言:javascript
运行
复制
SELECT RCMOUVNT.MATRICULE, RCMOUVNT.DATENT, RCMOUVNT.DATOUT FROM RCMOUVNT
WHERE RCMOUVNT.MATRICULE = '81123404' order by DATENT asc;

MATRICULE   DATENT      DATOUT
81123404    04/09/17    30/11/17
81123404    01/12/17    31/07/18
81123404    01/02/19    31/01/20

使用SQL的预期结果:

代码语言:javascript
运行
复制
MATRICULE   DATENT      DATOUT
81123404    04/09/17    31/07/18
81123404    01/02/19    31/01/20

我知道这是一个“鸿沟和孤岛”的问题,但我找不到任何答案。

EN

回答 1

Stack Overflow用户

发布于 2019-02-01 21:11:38

使用以下步骤的一种可能的解决方案

  • 查找不同的记录组(每个断点都会被分配一个新的GRP_ID)。请注意,您必须在与DATENT匹配之前将前一行的DATAOUT添加1天,才能获得您的logik。此外,第一行使用NVL.
  • fill自动获取一个组,组中的空值(第二个子查询)-按组使用LAST_VALUE
  • aggregate (std group BY) -第三个查询使用GROUP BYMIN。获取结果的MAX

代码语言:javascript
运行
复制
with q1   as (
select 
  MATRICULE,
  DATENT,
  DATOUT, 
  case when (nvl(lag(DATOUT +1) over (partition by MATRICULE order by DATENT),DATE'2500-01-01') <> DATENT) then 
     row_number() over (partition by MATRICULE order by DATENT) end grp
from RCMOUVNT 
), q2 as (
select 
  MATRICULE,
  DATENT,
  DATOUT,
  grp,
  last_value(grp ignore nulls) over (partition by MATRICULE order by DATENT) as grp2
from q1
)   
select 
    MATRICULE,  
    min(DATENT) DATENT, 
    max(DATOUT) DATOUT
from q2
group by MATRICULE, grp2
order by 1

 MATRICULE DATENT              DATOUT             
---------- ------------------- -------------------
  81123404 04.09.2017 00:00:00 31.07.2018 00:00:00
  81123404 01.02.2019 00:00:00 31.01.2020 00:00:00
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54479837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档