2

この質問のために代表的なサンプルデータが追加された、次のスキーマがあります。

SQL フィドル

Oracle 11g R2 スキーマのセットアップ:

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 |

各行を表示できるようにしたいのですが、その最新の値をatt1andに置き換えます。属性は、行が挿入された前回から変更されていない属性を示し、非属性は新しい値を示します。出力は次のようになります。att2idnullnull

| 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 |
4

1 に答える 1

5

lagと でこれを行うことができますignore nulls

クエリ:

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

結果

| 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 |
于 2012-12-06T15:18:32.493 に答える