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

PostgreSQL - стойността на колоната е променена - изберете оптимизиране на заявката

Ето как бих го направил с анализатор:

SELECT id, val
  FROM ( SELECT id, val
           ,LAG(val) OVER (ORDER BY id) AS prev_val
       FROM p ) x
  WHERE val <> COALESCE(prev_val, val)
  ORDER BY id

Актуализация (някакво обяснение):

Аналитичните функции работят като стъпка за последваща обработка. Резултатът от заявката се разделя на групи (partition by ) и аналитичната функция се прилага в контекста на групиране.

В този случай заявката е селекция от p . Прилаганата аналитична функция е LAG . Тъй като няма partition by клауза, има само едно групиране:целия набор от резултати. Това групиране е подредено по id . LAG връща стойността на предишния ред в групирането, използвайки посочения ред. Резултатът е, че всеки ред има допълнителна колона (с псевдоним prev_val), която е val от предходния ред. Това е подзаявката.

След това търсим редове, където val не съответства на val на предишния ред (prev_val). COALESCE обработва специалния случай на първия ред, който няма предишна стойност.

Аналитичните функции може да изглеждат малко странни в началото, но търсенето на аналитичните функции намира много примери, разказващи как работят. Например:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Само не забравяйте, че това е стъпка за последваща обработка. Няма да можете да извършите филтриране и т.н. върху стойността на аналитична функция, освен ако не я направите подзаявка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Barman Cloud – Част 1:Архив на WAL

  2. Защо всички бази данни имат публична схема в PostgreSQL?

  3. Postgresql индекс на xpath израз не дава ускорение

  4. Изпълнение на заявки в PostgreSQL, използвайки „подобно на“

  5. Заявките се забиват в PG::Connection#async_exec