如何解决应用连接,按日期列排序并选择列值之一不为空的第一行
我在 Postgres 数据库中有两个表(表 A 和表 B)。
两者都有共同的“id”列。表 A 有一列名为“id”,表 B 有三列:“id,date,value($)”。 对于表 A 的每个“id”,表 B 中存在多行,格式如下 - (id,value)。
例如,对于表A,如果表B中存在以下行,则“id”为1:
- (1,2018-06-21,null)
- (1,2018-06-20,2018-06-19,202)
- (1,2018-06-18,200)
我想提取最新的非空值。例如对于 id - 1,结果应该是 202。如果需要更多信息,请分享您的想法或告诉我。
解决方法
这是我继续使用的解决方案:
with mapping as ( select distinct table1.id,table2.value,table2.date,row_number() over (partition by table1.id order by table2.date desc nulls last) as row_number
from table1
left join table2 on table2.id=table1.id and table2.value is not null
)
select * from mapping where row_number = 1
如果有改进的余地,请告诉我。
,您可能需要内连接,而不是外连接。如果 table1 中的 id 在 table2 中不存在或只有空值,则日期和值都将获得 NULL。这是由于外连接的工作方式。它说的是,如果右侧表中没有任何内容与 ON 条件匹配,则为该表中的每一列返回 NULL。所以
with mapping as
(select distinct table1.id,row_number() over (partition by table1.id order by table2.date desc nulls last) as row_number
from table1
join table2 on table2.id=table1.id and table2.value is not null
)
select *
from mapping
where row_number = 1;
请参阅此处的 example。您的查询有效,因为您的所有测试数据都满足 ON 条件的第一个条件。您确实需要无法查看查询功能的测试数据。
注意: DATE 和 VALUE 对于列名来说是非常糟糕的选择。两者都是 SQL standard reserved words,虽然不是专门的 Postgres。进一步的 DATE 是 Postgres 数据类型。名称与数据类型相同的列会导致混淆。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。