Seleccionar las filas con los N valores únicos más recientes de una fecha y hora

Tengo una base de datos postgres en la que la mayoría de las tablas tienen una columna 'valid_time' que indica cuándo se pretende representar los datos en esa fila y una columna 'analysis_time', que indica cuándo se realizó la estimación (esto podría ser el mismo o un posterior tiempo que el tiempo válido en el caso de una medición o un tiempo anterior en el caso de un pronóstico). Por lo general, hay múltiples tiempos de análisis para cada tiempo válido, correspondientes a diferentes mediciones (si espera un poco, hay más datos disponibles para un tiempo determinado, por lo que el análisis es mejor pero la medición es menos rápida) y pronósticos con diferentes plazos de entrega.

Estoy usando SQLalchemy para acceder a esta base de datos en Python.

Lo que me gustaría hacer es poder extraer todas las filas con las N fechas y horas únicas más recientes de una columna específica. Por ejemplo, es posible que desee los 3 tiempos válidos únicos más recientes, pero normalmente serán más de 3 filas, porque habrá múltiples tiempos de análisis para cada uno de esos 3 tiempos válidos.

Soy nuevo en bases de datos relacionales. En cierto sentido, hay dos partes en esta pregunta; ¿Cómo se puede lograr esto en SQL simple y luego cómo traducirlo al ORM de SQLalchemy?

preguntado el 16 de septiembre de 13 a las 00:09

2 Respuestas

Aquí hay una solución a la primera parte de su pregunta. . . cómo hacer esto en SQL:

select t.*
from (select t.*,
             dense_rank() over (order by validtime desc) as seqnum
      from t
     ) t
where seqnum <= N;

Esto está usando el dense_rank() ventana/función analítica. Esto enumera los valores de tiempo, con empates que tienen el mismo valor de rango. los where la cláusula simplemente elige cuántos desea.

Respondido el 16 de Septiembre de 13 a las 01:09

No estoy seguro acerca de la parte de SQLalchemy, pero en cuanto a las consultas SQL, lo haría en dos pasos:

  1. Obtener los tiempos. Por ejemplo, algo como.

    SELECT DISTINCT valid_time FROM MyTable LIMIT 3 ORDER BY valid_time DESC;

  2. Obtenga las filas con esos tiempos, usando el paso anterior como una subconsulta:

    SELECT * FROM MyTable WHERE valid_time IN (SELECT DISTINCT valid_time FROM MyTable LIMIT 3 ORDER BY valid_time DESC);

Respondido el 16 de Septiembre de 13 a las 01:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.