我不确定如何解释它,所以希望这个例子可以. 这是我的数据:

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

row_num、id、number、版本、状态、日期

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()VERY(PARITION编号、版本、状态ORDEBY日期)等窗口函数.或者某种版本.它只是继续增加.行1到4得到数字1到4,行6得到数字5.

我需要 fresh 的眼睛.我想我想多了?

推荐答案

这会在与按日期顺序相同的编号和版本内中断status列的更改:

with breaks as (
    select *,
        case when
             lead(status, 1, 'X') over (
                 partition by number, version order by date) <> status
             then 1 end as keep
    from T
)
select * from breaks where keep = 1;

所有必要的值都集中在标记为保留的行中.

Sql相关问答推荐

根据内容确定要插入的列

PostgreSQL:如果发现多行具有相似列值,则跳过 Select 行

无效和不匹配的计数

Access 365将文本转换回BigInt

分组多输出访问查询问题

将FLOAT转换为VARBINARY,然后再转换回FLOAT

Oracle分层查询-两条路径在末尾合并为一条

使用与JOIN一起使用的查询后进行分页和排序

使用左外部联接更正列中第+1行的值时重复

如何使用SQL生成数据的滚动3天总和

通过UPDATE SELECT更新表时出现问题

如何为 ActiveRecord 联接应用附加条件

Postgresql:在链接表中判断相关表中插入值的条件

如何计算两个非周期性时间序列+分组的重叠持续时间

如何在 case 语句中使用聚合?

按所选的值将记录分组到不同的列中

如何根据与 BigQuery 中另一个表的匹配更新一个表中的列?

使用标准SQL 触发更新当前日期

snowfalke 会在 Select 运行时锁定表吗?

在 sql 中合并系列以删除重复项