PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak porównać bieżący wiersz z następnym i poprzednim wierszem w PostgreSQL?

To jest moje rozwiązanie wykorzystujące WINDOW functions . Użyłem lag i lead Funkcje. Oba zwracają wartość z kolumny z wiersza w przesunięciu względem bieżącego wiersza. lag wraca i lead idzie dalej w przesunięciu.

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)

Wersja uproszczona:

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

Główne punkty

  • = ANY() nie jest potrzebne, funkcja window zwraca pojedynczą wartość
  • niektóre nadmiarowe pola w podzapytaniu
  • nie ma potrzeby porządkowania według kolumn, PARTITION BY - ORDER BY obowiązuje w ciągu partycje
  • Nie używaj identyfikatorów z mieszaną wielkością liter bez cytowania, to tylko prowadzi do zamieszania. (Jeszcze lepiej:nie używaj mieszanych identyfikatorów wielkości liter w PostgreSQL kiedykolwiek )


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa funkcja LocalTime() w PostgreSQL

  2. postgres użytkownika uruchamia proces, który zużywa 100% wszystkich procesorów

  3. Przegląd parametrów połączenia libpq sslpassword w PostgreSQL 13

  4. Nie znaleziono odpowiedniego sterownika dla jdbc:postgresql://192.168.1.8:5432/NexentaSearch

  5. PostgreSQL nie może rozpocząć/zakończyć transakcji w PL/pgSQL