PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL - zmieniono wartość kolumny - wybierz optymalizację zapytania

Oto jak zrobiłbym to z analitykiem:

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

Aktualizacja (niektóre wyjaśnienie):

Funkcje analityczne działają jako etap przetwarzania końcowego. Wynik zapytania jest podzielony na grupy (partition by ), a funkcja analityczna jest stosowana w kontekście grupowania.

W tym przypadku zapytanie jest wyborem z p . Stosowana funkcja analityczna to LAG . Ponieważ nie ma partition by klauzula, istnieje tylko jedno grupowanie:cały zestaw wyników. To grupowanie jest uporządkowane według id . LAG zwraca wartość poprzedniego wiersza w grupowaniu w określonej kolejności. Wynikiem jest, że każdy wiersz ma dodatkową kolumnę (alias prev_val), która jest val poprzedniego rzędu. To jest podzapytanie.

Następnie szukamy wierszy, w których val nie pasuje do val poprzedniego wiersza (prev_val). COALESCE obsługuje szczególny przypadek pierwszego wiersza, który nie ma poprzedniej wartości.

Funkcje analityczne mogą początkowo wydawać się nieco dziwne, ale wyszukiwanie funkcji analitycznych pozwala znaleźć wiele przykładów pokazujących, jak działają. Na przykład:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Pamiętaj tylko, że jest to etap przetwarzania końcowego. Nie będziesz w stanie wykonać filtrowania itp. na wartości funkcji analitycznej, chyba że wykonasz podzapytanie.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psql:FATAL:Uwierzytelnianie identyfikatora nie powiodło się dla użytkownika postgres

  2. Wstawianie ciągu tekstowego z szesnastką do PostgreSQL jako bajt

  3. Jak połączyć zrzut do bazy danych z PostgreSQL?

  4. PHP - Postgresql Jak mogę wycofać zapytanie, jeśli zwraca błąd?

  5. PostgreSQL Uzyskaj losową datę/czas/znacznik czasu pomiędzy dwoma datami/czasami