sql >> Database teknologi >  >> RDS >> Oracle

Hvad er der galt med denne FIRST_VALUE-forespørgsel?

Standard RANGE / ROWS for FIRST_VALUE (som for enhver anden analytisk funktion) er BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW .

Hvis du tilføjer IGNORE NULLS , derefter NULL værdier tages ikke i betragtning, når intervallet opbygges.

RANGE bliver BETWEEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCEPT FOR THE NULL ROWS (det er ikke en gyldig OVER klausul).

Siden din txt 's, der er NULL har et højt id 's, vælges de først, og deres områder er tomme, da der ikke er nogen ikke-NULL rækker mellem dem og UNBOUNDED PRECEDING

Du bør enten ændre ORDER BY eller RANGE klausul i din forespørgsel.

Ændring af ORDER BY sætter rækkerne med NULL id'er til slutningen af ​​vinduet, så en ikke-NULL værdi (hvis nogen) vil altid blive valgt først, og RANGE vil garanteret starte fra denne værdi:

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

Ændring af RANGE omdefinerer området til at inkludere alle ikke-NULL rækker i partitionen:

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. Hvordan ses pivottabel i Laravel 5.4?

  2. Sådan opdeles kommasepareret tekst i MySQL-lagret procedure

  3. Brug af Java til at oprette forbindelse til en Oracle-database

  4. PostgreSQL:rækkefølge efter kolonne, med specifik IKKE-NULL værdi LAST