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

¿Cómo comparar la fila actual con la fila siguiente y anterior en PostgreSQL?

Esta es mi solución usando WINDOW functions . Usé el lag y lead funciones Ambos devuelven un valor de una columna de una fila en desplazamiento de la fila actual. lag regresa y lead va a continuación en el desplazamiento.

SELECT tokcat.text
FROM (
    SELECT text, category, chartype, lag(category,1) OVER w as previousCategory, lead(category,1) OVER w as nextCategory
    FROM token t, textBlockHasToken tb
    WHERE tb.tokenId = t.id
    WINDOW w AS (
        PARTITION BY textBlockId, sentence
        ORDER BY textBlockId, sentence, position
    )
) tokcat
WHERE 'NAME' = ANY(previousCategory)
AND 'NAME' = ANY(nextCategory)
AND 'NAME' <> ANY(category)

Versión simplificada:

SELECT text
FROM (
    SELECT text
          ,category 
          ,lag(category) OVER w as previous_cat
          ,lead(category) OVER w as next_cat
    FROM   token t
    JOIN   textblockhastoken tb ON tb.tokenid = t.id
    WINDOW w AS (PARTITION BY textblockid, sentence ORDER BY position)
    ) tokcat
WHERE  category <> 'NAME'
AND    previous_cat = 'NAME'
AND    next_cat = 'NAME';

Puntos principales

  • = ANY() no es necesario, la función de ventana devuelve un solo valor
  • algunos campos redundantes en la subconsulta
  • no es necesario ordenar por columnas, que usted PARTITION BY - el ORDEN POR se aplica dentro de particiones
  • No use identificadores de mayúsculas y minúsculas sin citar, solo genera confusión. (Mejor aún:no use identificadores de mayúsculas y minúsculas en PostgreSQL nunca )