PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Ordem de classificação determinística para funções de janela


Se você não tiver slno em sua tabela, então você não tem nenhuma informação confiável sobre qual linha foi inserida primeiro. Não há ordem natural em uma tabela, a ordem física das linhas pode mudar a qualquer momento (com qualquer atualização ou com VACUUM , etc)

Você poderia use um não confiável truque:ordenar pelo ctid interno .
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;

  • Na ausência de qualquer outra informação, qual linha veio primeiro (o que é um erro de design para começar, conserte!), você pode tentar salvar o que puder usando o ID da tupla ctid

    As linhas estarão em ordem física quando inseridas inicialmente, mas isso pode mudar a qualquer momento com qualquer operação de gravação na tabela ou VACUUM ou outros eventos.
    Esta é uma medida de último recurso e será quebrar.

  • Sua consulta apresentada era inválida em vários aspectos:nome da coluna ausente no 1º CTE, nome da tabela ausente no 2º CTE, ...

  • Você não precisa de um CTE para isso.

Mais simples com DISTINCT ON (considerações para ctid aplicar o mesmo):
SELECT DISTINCT ON (id)
       id, status
FROM   status
WHERE  date >= '2015-06-01'
AND    date <  '2015-07-01'
ORDER  BY id, date, ctid;