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

Devuelve filas que tienen un máximo de una columna en Postgresql

Postgres admite funciones de ventana que se adaptan a esta situación:

select date, symbol, value, created_time
from (select *,
    rank() over (partition by date, symbol order by created_time desc) as rownum
  from test_table) x
where rownum = 1

Para cada combinación de date , symbol , esta consulta devuelve el value y created_time de la fila con el valor más alto (es decir, último ) created_time de esa date y symbol .

Sugeriría este índice:

CREATE UNIQUE INDEX test_table_idx 
  ON test_table (date, symbol, created_time, value)

Es una cobertura index (tiene todos los valores que necesita para la consulta, obviando la necesidad de acceder a la tabla real, y que ya tenía), pero tenga en cuenta que created_time viene antes value , por lo que los datos ya están en su orden de partición y value es el atributo menos importante, porque no participa en ninguna determinación de qué fila devolver.