PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Функции на прозореца:last_value(ORDER BY ... ASC) същите като last_value(ORDER BY ... DESC)

Проблемът с LAST_VALUE() е, че правилата по подразбиране за клаузите за прозорец премахват стойностите, които наистина искате. Това е много фин проблем и е вярно във всички бази данни, които поддържат тази функционалност.

Това идва от блог на Oracle:

Докато сме по темата за клаузите за прозорец, имплицитната и неизменна клауза за прозорец за функциите FIRST и LAST е РЕД МЕЖДУ НЕОГРАНИЧЕН ПРЕДШЕСТВАЩ И НЕОГРАНИЧЕН СЛЕД, с други думи всички редове в нашия дял. За FIRST_VALUE и LAST_VALUE клаузата за прозорец по подразбиране, но променлива, е РЕДОВЕ МЕЖДУ НЕОБГРАНИЧЕН ПРЕДИШЕН И ТЕКУЩ РЕД, с други думи изключваме редове след текущия. Изпускането на редове от дъното на списъка не прави разлика, когато търсим първия ред в списъка ( FIRST_VALUE), но прави разлика, когато търсим последния ред в списъка (LAST_VALUE) така че обикновено ще трябва или да посочите ROWS BETWEENUNBOUNDED PRECEDING И UNBOUNDED FOLLOWING изрично, когато използватеLAST_VALUE, или просто да използвате FIRST_VALUE и да обърнете реда на сортиране .

Следователно, просто използвайте FIRST_VALUE() . Това прави това, което искате:

with test (id, session_ID, value) as (
      (VALUES (0, 2, 100),
              (1, 2, 120),
              (2, 2, 140),
              (3, 1, 900),
              (4, 1, 800),
              (5, 1, 500)
      )
     )
select id,
       first_value(value) over (partition by session_ID order by id) as first_value_window,
       first_value(value) over (partition by session_ID order by id desc) as first_value_window_desc
from test
order by id


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. процентили от данни на хистограмата

  2. сериен в postgres се увеличава, въпреки че добавих на конфликт не прави нищо

  3. Върнете типа на таблицата от функция A в PostgreSQL

  4. Как да използвам (инсталирам) dblink в PostgreSQL?

  5. Postgresql изберете, докато се достигне определена обща сума