首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并以显示最新的非空值。

合并以显示最新的非空值。
EN

Stack Overflow用户
提问于 2012-12-06 15:18:32
回答 1查看 56关注 0票数 2

我有以下模式,并为这个问题添加了有代表性的示例数据:

SQL Fiddle

Oracle 11g R2架构设置

代码语言:javascript
复制
create table foo(id integer, att1 varchar(9), att2 varchar(9), from_at date);
insert into foo(id, att1, att2, from_at) values(1, 'J', null, sysdate-5);
insert into foo(id, att1, att2, from_at) values(1, null, 'L', sysdate-4);
insert into foo(id, att1, att2, from_at) values(1, 'B', null, sysdate-3); 
insert into foo(id, att1, att2, from_at) values(1, 'C', null, sysdate-2); 
insert into foo(id, att1, att2, from_at) values(1, null, 'H', sysdate-1); 
insert into foo(id, att1, att2, from_at) values(1, 'A', 'H', sysdate);
insert into foo(id, att1, att2, from_at) values(2, null, 'H', sysdate-1); 
insert into foo(id, att1, att2, from_at) values(2, 'A', null, sysdate);


| ID |   ATT1 |   ATT2 |                         FROM_AT |
----------------------------------------------------------
|  1 |      J | (null) | December, 01 2012 15:13:42+0000 |
|  1 | (null) |      L | December, 02 2012 15:13:42+0000 |
|  1 |      B | (null) | December, 03 2012 15:13:42+0000 |
|  1 |      C | (null) | December, 04 2012 15:13:42+0000 |
|  1 | (null) |      H | December, 05 2012 15:13:42+0000 |
|  1 |      A |      H | December, 06 2012 15:13:42+0000 |
|  2 | (null) |      H | December, 05 2012 15:13:42+0000 |
|  2 |      A | (null) | December, 06 2012 15:13:42+0000 |

我希望能够显示每一行,但是将att1att2替换为id的最新值。null属性表示与上一次插入行时相比没有变化的属性,非null属性表示新值。输出应该如下所示:

代码语言:javascript
复制
| ID |   ATT1 |   ATT2 |
------------------------
|  1 |      J | (null) |
|  1 |      J |      L |
|  1 |      B |      L |
|  1 |      C |      L |
|  1 |      C |      H |
|  1 |      A |      H |
|  2 | (null) |      H |
|  2 |      A |      H |
EN

回答 1

Stack Overflow用户

发布于 2012-12-06 15:18:32

您可以使用lagignore nulls来完成这一任务。

查询

代码语言:javascript
复制
select id, 
       nvl(att1,lag(att1 ignore nulls) over (partition by id order by from_at))
         as att1,
       nvl(att2,lag(att2 ignore nulls) over (partition by id order by from_at)) 
         as att2
from foo

结果

代码语言:javascript
复制
| ID |   ATT1 |   ATT2 |
------------------------
|  1 |      J | (null) |
|  1 |      J |      L |
|  1 |      B |      L |
|  1 |      C |      L |
|  1 |      C |      H |
|  1 |      A |      H |
|  2 | (null) |      H |
|  2 |      A |      H |
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13746714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档