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

150
Visualizações
Devolver elementos X antes y después de ordenados por una propiedad que no es SQL única

Estoy tratando de escribir una consulta que devuelva X elementos antes y después de una entidad determinada ordenada por una propiedad que no es única.

Por ejemplo: la propiedad a es la columna principal (un UUID único), b es la propiedad por la que me gustaría ordenar

 table -------- ab -------- ag 1 sb 1 sf 1 xk 2 - bd 2 ve 2 ku 2 lt 3 ac 3

Si quisiera devolver los elementos antes y después de a = bd ordenados por b

Antes

 SELECT * FROM table WHERE b >= 2 ORDER BY b DESC, a DESC LIMIT x

Después

 SELECT * FROM table WHERE b <= 2 ORDER BY b ASC, a DESC OFFSET 1 LIMIT x

Si la propiedad de b fuera única, esto funcionaría. ¿Cómo haría esto en una propiedad no única?

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

0

Puede utilizar funciones de ventana:

 select t.* from (select t.*, count(*) filter (where a = 'bd') over (order by b, a rows between x preceding and x following) as cnt from t ) t where cnt > 0;

Aquí hay un db<>fiddle.

over 4 years ago · Santiago Trujillo Relatório

0

Esta es una implementación que hace ventanas.

 WITH data AS (SELECT * FROM id_value), before AS ( SELECT * FROM id_value WHERE VALUE < (SELECT VALUE FROM id_value WHERE id = ID) ORDER BY VALUE DESC, id DESC limit 1200 ), after AS ( SELECT * FROM id_value WHERE VALUE >= (SELECT VALUE FROM id_value WHERE id = ID) ORDER BY VALUE ASC, id ASC limit 1200 ), windowed AS ( (SELECT * FROM before) UNION ALL (SELECT * FROM after) ) SELECT t.* FROM ( SELECT *, COUNT(*) filter ( WHERE id = ID ) over ( ORDER BY VALUE, id rows BETWEEN 5 preceding AND 5 following ) AS cnt FROM windowed ) t WHERE cnt > 0;
over 4 years ago · Santiago Trujillo Relatório

0

Podrías row_number() de la siguiente manera:

 select a, b from ( select t.*, max(rn) filter(where a = 'bd') over() target_rn from ( select t.*, row_number() over(order by b, a) rn from mytable t ) t ) t where abs(rn - target_rn) <= 2
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