我试图弄清楚如何编写查询来选择连续记录的日期范围。 我有一个名为产品的表,它有以下列和数据。
产品_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。
我尝试通过连接但无法弄清楚
首先计算分组(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