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;