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

Deterministické pořadí řazení pro funkce okna

Pokud nemáte slno ve vaší tabulce, pak nemáte žádné spolehlivé informace, který řádek byl vložen jako první. Tabulka nemá přirozené pořadí, fyzické pořadí řádků se může kdykoli změnit (při jakékoli aktualizaci nebo pomocí VACUUM atd.)

Mohli byste použít nespolehlivé trik:objednávejte podle interního ctid .

select *
from  (
   select id, status
        , row_number() OVER (PARTITION BY id
                             ORDER BY date, ctid) AS row_num
   from   status  -- that's your table name??
   where  date >= '2015-06-01'  -- assuming column is actually a date
   and    date <  '2015-07-01'
  ) sub
where  row_num = 1;
  • Při absenci jakýchkoli dalších informací, který řádek byl první (což je chyba návrhu pro začátek to opravte!), můžete zkusit zachránit, co se dá, pomocí interního id n-tice ctid

    Řádky budou při prvním vložení ve fyzickém pořadí, ale to se může kdykoli změnit jakoukoli operací zápisu do tabulky nebo VACUUM nebo jiné události.
    Toto je poslední opatření a bude přestávka.

  • Váš předložený dotaz byl neplatný v několika bodech:chybějící název sloupce v 1. CTE, chybějící název tabulky v 2. CTE, ...

  • K tomu nepotřebujete CTE.

Jednodušší s DISTINCT ON (vzhledem k ctid použít totéž):

SELECT DISTINCT ON (id)
       id, status
FROM   status
WHERE  date >= '2015-06-01'
AND    date <  '2015-07-01'
ORDER  BY id, date, ctid;



  1. mysql, ifnull vs coalesce, co je rychlejší?

  2. Automaticky odstranit data křižovatky spolu s DELETE záznamu?

  3. postgresql - přidat booleovský sloupec do výchozí sady tabulky

  4. Smyčka přes Array v PHP se vrátila z MySQL Query