报告号码和版本的唯一状态变化

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

我不知道如何解释它,所以希望这个例子能解释。 这是我的数据:

注意:添加 row_num 仅供参考。它不是数据的一部分

row_num、id、编号、版本、状态、日期

1, 99999, CDC800, v8.5, F, 2024-02-05
2 ,99904, CDC800, v8.5, F, 2023-12-07
3, 98923, CDC800, v8.5, F, 2023-10-26
4, 97999, CDC800, v8.5, F, 2023-9-13
5, 96900, CDC800, v8.5, C, 2023-7-31
6, 96844, CDC800, v8.5, F, 2023-03-02
7, 95000, CDC800, v8.5, F, 2022-09-19
8, 97500, CDC800, v9.2, C, 2023-03-20
9, 67900, CDC800, v12.0,F, 2024-01-01
10,88777, CDC800, v20.2,F, 2022-05-15

按编号、版本、日期 DESC 排序

第 1 行到第 4 行必须是具有最大日期的单行 第 5 行保持不变 第 6 行和第 7 行必须是具有最大日期的单行 第 8、9 和 10 行需要保持不变。

1, 99999, CDC800, v8.5, F, 2024-02-05
5, 96900, CDC800, v8.5, C, 2023-7-31
6, 96844, CDC800, v8.5, F, 2023-03-02
8, 97500, CDC800, v9.2, C, 2023-03-20
9, 67900, CDC800, v12.0,F, 2024-01-01
10,88777, CDC800, v20.2,F, 2022-05-15

当我按数字、版本、状态分组时,它当然包括第 1 行到第 5 行和第 6 行。我需要第 6 行独立,因为状态短时间内更改为 F。

如果我使用窗口函数,例如 ROW_NUMBER () OVER (PARTITION number, version, status ORDER BY date) ... 或某些版本 ... 它只会继续编号。第 1 行到第 4 行的编号为 1 到 4,第 6 行的编号为 5。

我需要新鲜的眼光。我想我想多了?

sql postgresql
1个回答
0
投票

不清楚您需要中断哪些列。这使用了所有三个:

with breaks as (
    select *,
    case when lead(number)  over (order by date) = number
          and lead(version) over (order by date) = version
          and lead(status)  over (order by date) = status
         then 0 end else 1 end as keep
    from T
)
select * from breaks where keep = 1;

我颠倒了那里的逻辑,这样你就不必过多地明确考虑空值。

© www.soinside.com 2019 - 2024. All rights reserved.