Estoy usando una base de datos PostgreSQL (12.8).
Dados events ordenados por start_time , me gustaría recuperar los próximos 10 eventos después del evento con id = 10 .
Mi primera idea fue algo como esto:
SELECT * FROM events ORDER BY start_time WHERE id > 10 LIMIT 10; Sin embargo, esto no funciona porque la cláusula WHERE siempre se aplica antes que la cláusula ORDER BY . En otras palabras, primero se seleccionan todos los eventos que tienen un id > 10 , y luego solo los eventos restantes se ordenan por start_time .
A continuación, se me ocurrió una expresión CTE. Si el registro con ID 10 tiene row_number 3 :
WITH ordered_events AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY start_time DESC) AS row_number FROM events ) SELECT * FROM ordered_events WHERE row_number > 3 LIMIT 10; Esto funciona como se desea, si supiera el número de row_number antemano. Sin embargo, solo conozco la ID, es decir, id = 10 .
a) Idealmente, haría algo como esto (sin embargo, no sé si hay alguna forma de escribir tal expresión):
WITH ordered_events AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY start_time DESC) AS row_number FROM events ) SELECT * FROM ordered_events WHERE row_number > (row_number of row where the ID is 10) # <------ LIMIT 10; b) La única alternativa que se me ocurrió es primero recuperar el número de row_number para todos los registros y luego hacer una segunda consulta.
Primera consulta:
SELECT id, ROW_NUMBER() OVER (ORDER BY start_time DESC) AS row_number FROM events; Ahora sé que el número de row_number del registro con ID 10 es 3 . Por lo tanto, tengo suficiente información para realizar la consulta con la expresión CTE como se describe anteriormente. Sin embargo, el rendimiento es malo porque necesito recuperar todos los registros de events en la primera consulta.
Realmente lo agradecería si pudiera ayudarme a encontrar una forma (efectiva) de hacer esto.
Solo desea filas con una hora de inicio menor que la hora de inicio de ID 10. Use una cláusula WHERE para esto.
select * from events where start_time < (select start_time from events where id = 10) order by start_time desc limit 10;Esta consulta puede beneficiarse de un índice en start_time. (Doy por sentado que ya hay un índice en ID para encontrar la fila con ID 10 rápidamente).