sql >> Databáze >  >> RDS >> PostgreSQL

Jak porovnat aktuální řádek s dalším a předchozím řádkem v PostgreSQL?

Toto je moje řešení pomocí WINDOW functions . Použil jsem lag a lead funkcí. Oba vrátí hodnotu ze sloupce z řádku v posunu od aktuálního řádku. lag vrátí se a lead je další v offsetu.

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)

Zjednodušená verze:

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

Hlavní body

  • = ANY() není potřeba, funkce okna vrací jedinou hodnotu
  • některá nadbytečná pole v dílčím dotazu
  • není třeba řadit podle sloupců, které PARTITION BY - OBJEDNÁVKA BY platí do oddíly
  • Nepoužívejte smíšené identifikátory velkých a malých písmen bez uvozovek, vede to pouze k nejasnostem. (Ještě lépe:v PostgreSQL nikdy nepoužívejte smíšené identifikátory velkých a malých písmen )


  1. Oracle, nastavte datum a čas jako první den v měsíci

  2. Použití konfiguračních tabulek k definování skutečného pracovního postupu

  3. Jak funguje EXPORT_SET() v MariaDB

  4. Jak dochází k poškození databáze?