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.