sql >> Base de Datos >  >> RDS >> PostgreSQL

Orden de clasificación determinista para funciones de ventana

Si no tienes slno en su tabla, entonces no tiene ninguna información confiable sobre qué fila se insertó primero. No existe un orden natural en una tabla, el orden físico de las filas puede cambiar en cualquier momento (con cualquier actualización o con VACUUM , etc)

podrías utiliza un poco fiable truco:ordenar por el 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;
  • En ausencia de cualquier otra información, qué fila apareció primero (que es un error de diseño para empezar, ¡arréglelo!), puede intentar guardar lo que pueda usando el ID de tupla ctid

    Las filas estarán en orden físico cuando se inserten inicialmente, pero eso puede cambiar en cualquier momento con cualquier operación de escritura en la tabla o VACUUM u otros eventos.
    Esta es una medida de último recurso y será descanso.

  • Su consulta presentada no era válida por varios motivos:falta el nombre de la columna en la 1.ª CTE, falta el nombre de la tabla en la 2.ª CTE, ...

  • No necesitas un CTE para esto.

Más simple con DISTINCT ON (consideraciones para ctid aplicar lo mismo):

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