sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL - hodnota sloupce změněna - vyberte optimalizaci dotazu

Takto bych to udělal s analytikem:

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

Aktualizace (nějaké vysvětlení):

Analytické funkce fungují jako krok následného zpracování. Výsledek dotazu je rozdělen do seskupení (partition by ) a analytická funkce je aplikována v kontextu seskupení.

V tomto případě je dotaz výběrem z p . Použitá analytická funkce je LAG . Protože neexistuje žádný partition by klauzule, existuje pouze jedno seskupení:celá sada výsledků. Toto seskupení je uspořádáno podle id . LAG vrátí hodnotu předchozího řádku v seskupení pomocí zadaného pořadí. Výsledkem je, že každý řádek má další sloupec (s aliasem prev_val), což je val předchozího řádku. To je poddotaz.

Pak hledáme řádky, kde je val neodpovídá val předchozího řádku (prev_val). COALESCE zpracovává speciální případ prvního řádku, který nemá předchozí hodnotu.

Analytické funkce se mohou na první pohled zdát trochu divné, ale při hledání analytických funkcí najdete mnoho příkladů, jak fungují. Například:http ://www.cs.utexas.edu/~cannata/dbms/Analytic%20Functions%20in%20Oracle%208i%20and%209i.htm Nezapomeňte, že se jedná o krok následného zpracování. Nebudete moci provádět filtrování atd. hodnoty analytické funkce, pokud na ni nezadáte dílčí dotaz.



  1. Stejný název pro pole formuláře a pole databázové tabulky?

  2. SequelizeConnectionRefusedError:připojte ECONNREFUSED 127.0.0.1:3306

  3. Jak zobrazit barmské znaky na webu a zaznamenat je v MySQL, pokud uživatel nemá písmo?

  4. nelze se připojit k postgresové instanci AWS RDS z pgadmin4