Tạo bảng và ngày lấy mẫu
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.
Và sau đó sử dụng KEEP mệnh đề trên MAX hàm tổng hợp với ORDER BY đặt các hàng có NULL quan sát ở cuối. bất kỳ ngày nào bạn sử dụng trong ORDER BY cần sớm hơn lần quan sát thực tế sớm nhất trong bảng.
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
Tôi nghi ngờ rằng có một giải pháp thanh lịch hơn để bỏ qua các giá trị NULL hơn là thêm CASE câu lệnh cho ORDER BY nhưng CASE hoàn thành công việc.