Erstellen Sie die Tabelle und das Probendatum
SQL> create table observation(
2 item_id number,
3 dt date,
4 val1 number,
5 val2 number );
Table created.
SQL> insert into observation values( 1, date '2011-12-01', 1, null );
1 row created.
SQL> insert into observation values( 1, date '2011-12-02', null, 2 );
1 row created.
SQL> insert into observation values( 1, date '2011-12-03', 3, null );
1 row created.
SQL> insert into observation values( 2, date '2011-12-01', 4, null );
1 row created.
SQL> insert into observation values( 2, date '2011-12-02', 5, 6 );
1 row created.
Und dann verwenden Sie den KEEP
-Klausel auf dem MAX
Aggregatfunktion mit einem ORDER BY
das setzt die Zeilen mit NULL-Beobachtungen am Ende. egal welches Datum Sie im ORDER BY
verwenden muss früher sein als die früheste echte Beobachtung in der Tabelle.
SQL> ed
Wrote file afiedt.buf
1 select item_id,
2 max(val1) keep( dense_rank last
3 order by (case when val1 is not null
4 then dt
5 else date '1900-01-01'
6 end) ) val1,
7 max(val2) keep( dense_rank last
8 order by (case when val2 is not null
9 then dt
10 else date '1900-01-01'
11 end) ) val2
12 from observation
13* group by item_id
SQL> /
ITEM_ID VAL1 VAL2
---------- ---------- ----------
1 3 2
2 5 6
Ich vermute, dass es eine elegantere Lösung gibt, die NULL-Werte zu ignorieren, als den CASE
hinzuzufügen -Anweisung zum ORDER BY
aber der CASE
erledigt die Arbeit.