sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan sammenligner man den nuværende række med næste og forrige række i PostgreSQL?

Dette er min løsning ved hjælp af WINDOW functions . Jeg brugte lag og lead funktioner. Begge returnerer en værdi fra en kolonne fra en række i offset fra den aktuelle række. lag går tilbage og lead går næste gang i offset.

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)

Forenklet version:

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';

Vigtige punkter

  • = ANY() ikke er nødvendig, returnerer vinduesfunktionen en enkelt værdi
  • nogle overflødige felter i underforespørgslen
  • ingen grund til at sortere efter kolonner, som du PARTITION BY - BESTILLING AF gælder inden for partitioner
  • Brug ikke id'er med blandede store og små bogstaver uden at citere, det fører kun til forvirring. (Bedre endnu:Brug ikke id'er med blandede store og små bogstaver i PostgreSQL nogensinde )


  1. MySQL &MariaDB Database Backup Ressourcer

  2. Forskellige måder at se tabeller på i MySQL Server

  3. Oracle SQL - REGEXP_LIKE indeholder andre tegn end a-z eller A-Z

  4. Sådan opretter du forbindelse til databasen fra Unity