Oracle 连续记录的日期范围

问题描述 投票:0回答:1

我试图弄清楚如何编写查询来选择连续记录的日期范围。 我有一个名为产品的表,它有以下列和数据。

产品_id 状态 状态_日期
123 A 2024年9月12日
123 A 2024年7月15日
123 2024年6月1日
123 A 2024年5月1日
123 2024 年 4 月 1 日
245 2024年8月24日
245 A 2024年6月1日
245 2024年5月1日

输出是

产品_id 状态 状态_日期
123 A 2024年7月15日
245 2024年8月24日

因为产品 123 的最新状态是 A,并且自 07-15-2024 以来一直是 A(通过连续检查之前的 A 状态) 产品 245 的最新状态是 I,之前的状态是 A,因此仅选择当前的 I 状态日期,即 08-24-2024。

我尝试通过连接但无法弄清楚

sql oracle oracle-sqldeveloper
1个回答
0
投票

首先计算分组(product_id,status),然后分析以获得每组的第一个/最后一个值:

with data(product_id, status, status_date) as (
    select 123, 'A', to_date('09-12-2024', 'mm-dd-yyyy') union all
    select 123, 'A', to_date('07-15-2024', 'mm-dd-yyyy') union all
    select 123, 'I', to_date('06-01-2024', 'mm-dd-yyyy') union all
    select 123, 'A', to_date('05-01-2024', 'mm-dd-yyyy') union all
    select 123, 'I', to_date('04-01-2024', 'mm-dd-yyyy') union all
    select 245, 'I', to_date('08-24-2024', 'mm-dd-yyyy') union all
    select 245, 'A', to_date('06-01-2024', 'mm-dd-yyyy') union all
    select 245, 'I', to_date('05-01-2024', 'mm-dd-yyyy') 
)
select distinct d.product_id, d.status,
    nvl (
        first_value(status_date) over(partition by product_id, grp 
            order by status_date rows between unbounded preceding and 1 preceding),
        last_value(status_date) over(partition by product_id, grp 
            order by status_date rows between unbounded preceding and current row) 
    ) as status_date
from (
    select d.*, 
        row_number() over(partition by product_id order by status_date desc)
        - row_number() over(partition by product_id, status order by status_date desc) as grp
    from data d
) d
where grp = 0
order by product_id, status_date desc
;

123 A   15/07/24
245 I   24/08/24
© www.soinside.com 2019 - 2024. All rights reserved.