PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да сравним текущия ред със следващия и предишния ред в PostgreSQL?

Това е моето решение с помощта на WINDOW functions . Използвах lag и lead функции. И двете връщат стойност от колона от ред в изместване спрямо текущия ред. lag връща назад и lead следва в отместването.

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)

Опростена версия:

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

Основни точки

  • = ANY() не е необходимо, функцията прозорец връща една стойност
  • някои излишни полета в подзаявката
  • няма нужда да подреждате по колони, които PARTITION BY - ORDER BY се прилага в рамките на дялове
  • Не използвайте смесени идентификатори без цитати, това води само до объркване. (Още по-добре:не използвайте смесени идентификатори на главни и малки букви в PostgreSQL никога )


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвам PostgreSQL контейнер със съществуващи данни?

  2. Прага PostgreSQL среща

  3. Проблем с възстановяването на базата данни Heroku

  4. Създаване на PostgreSQL последователност към поле (което не е ID на записа)

  5. Гарантирано ли е, че INSERT RETURNING ще върне нещата в правилния ред?