我有一张桌子,就像:

ID LOAD_DATE START_VAL END_VAL
1 2023-06-01 NULL 7
1 2023-06-03 NULL 5
1 2023-06-03 5 7
2 2023-06-08 NULL 2
2 2023-06-09 NULL 3
2 2023-06-10 NULL 4

我正在try 获取每个ID的最新记录.但是,如果有多个最新日期的记录,我希望保留每个ID的最新记录,其中Start_Val和End_Val不为空.例如,对于ID 1,有两条日期为2023-06-03的记录,但如果存在Start_Val和End_Val都不为空的记录,我想要确定记录的优先级.

我try 了如下查询:

SELECT *
FROM MY_TABLE
QUALIFY ROW_NUMBER() OVER (PARTITION BY ID ORDER BY LOAD_DATE DESC) = 1;

但是,这将返回一个表,如

ID LOAD_DATE START_VAL END_VAL
1 2023-06-03 NULL 5
2 2023-06-10 NULL 4

因此,对于ID 1,START_VAL和END_VAL均为NOT NULL的记录在QUALIFY语句中不区分优先级.有没有办法在分区中定义这种逻辑?

推荐答案

这只是调优窗口函数的order by子句;您可以添加另一个排序级别,对val列和null列都不是null的行进行优先排序:

select *
from my_table
qualify row_number() over (
    partition by id 
    order by load_date desc, 
             case when start_val is not null and end_val is not null then 0 else 1 end
) = 1;

请注意,即使使用这种技术,仍然可能存在平局(这意味着相同的id中有超过一行具有最新日期和两个非空值)-在这种情况下,实际上没有定义将挑选哪条记录.我建议至少多加一个关卡来避免这种情况.如果您有一个主键列,比如pk:

select *
from my_table
qualify row_number() over (
    partition by id 
    order by load_date desc, 
             case when start_val is not null and end_val is not null then 0 else 1 end,
             pk
) = 1;

Sql相关问答推荐

SQL:创建查询以添加减少的总数

使用group by后我的平均输出不是我想要的

跨多列的PostgreSQL非不同对

SQL更新,在2个额外的表上使用内部连接

Select 最大值,但当并列时,从其他列 Select 最大值

如何根据计数和分组获取订单总数

SQL子查询返回多个值错误

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

判断序列索引处的序列是否完整

直接加法(1+1)与聚合函数SUM(1+1)的区别是什么

Select 非重复值并按条件排除行

如何实现同一列的递归计算?

如何设计一个调用嵌套函数并仅在所有被调用的嵌套函数都提交时才提交的事务,例如,如果一个子函数失败则中止?

统计PostgreSQL中前10个最大大小表的行数

在 postgres 中插入或更新 jsonb 数组的对象

SQL Select 字母范围没有给我任何东西

SQL Server: 将JSON对象数组转换为表格格式

在 PostgreSQL 中使用重音敏感排序进行重音不敏感搜索

SQL - 使用子查询返回多行的 LIKE 命令

SQL Server Where 条件