Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

123
Visualizações
ORDENAR POR antes de DONDE - ¿alternativas?

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.

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

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).

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda