我不知道如何解释它,所以希望这个例子能解释。 这是我的数据:
注意:添加 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。
我需要新鲜的眼光。我想我想多了?
不清楚您需要中断哪些列。这使用了所有三个:
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;
我颠倒了那里的逻辑,这样你就不必过多地明确考虑空值。