Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Có gì sai với truy vấn FIRST_VALUE này?

RANGE / ROWS mặc định cho FIRST_VALUE (như đối với bất kỳ chức năng phân tích nào khác) là BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW .

Nếu bạn thêm IGNORE NULLS , rồi đến NULL giá trị không được tính đến khi tạo phạm vi.

RANGE trở thành BETWEEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCEPT FOR THE NULL ROWS (nó không phải là OVER hợp lệ mệnh đề).

Kể từ khi txt của bạn đó là NULLid cao Chúng được chọn đầu tiên và phạm vi của chúng trống, vì không có NULL hàng giữa chúng và UNBOUNDED PRECEDING

Bạn nên thay đổi ORDER BY hoặc RANGE mệnh đề của truy vấn của bạn.

Thay đổi ORDER BY đặt các hàng bằng NULL id ở cuối cửa sổ để không phải là NULL giá trị (nếu có) sẽ luôn được chọn trước tiên và RANGE đảm bảo sẽ bắt đầu từ giá trị đó:

with t
as (
  select 450 id, null txt , 3488 id_usr from dual union all
  select 449   , null     , 3488        from dual union all
  select  79   , 'A'      , 3488        from dual union all
  select  78   , 'X'      , 3488        from dual 
)
select id
     , txt
     , id_usr
     , first_value(txt) over (partition by id_usr order by NVL2(TXT, NULL, id) DESC) first_one
  from t

Thay đổi RANGE xác định lại phạm vi để bao gồm tất cả không phải NULL hàng trong phân vùng:

with t
as (
  select 450 id, null txt , 3488 id_usr from dual union all
  select 449   , null     , 3488        from dual union all
  select  79   , 'A'      , 3488        from dual union all
  select  78   , 'X'      , 3488        from dual 
)
select id
     , txt
     , id_usr
     , first_value(txt IGNORE NULLS) over (partition by id_usr order by id DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) first_one
  from t



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trả lại tất cả Người dùng, ngay cả những người không phù hợp với tiêu chí của tôi

  2. Oracle PL / SQL:Kiểm tra xem BLOB hoặc CLOB có trống không

  3. ORACLE APEX - Thiết lập một Nút để điền vào một trường văn bản

  4. Làm cách nào để CHỌN từ cột kiểu đối tượng trong Oracle 11g?

  5. So sánh hai lược đồ và cập nhật lược đồ cũ với các cột mới của lược đồ mới