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

Znajdź zdania z dwoma słowami sąsiadującymi ze sobą w Pg

Prostsze rozwiązanie, ale daje wyniki tylko wtedy, gdy nie ma luk w item.position s:

SELECT DISTINCT sentence.sentenceid 
  FROM sentence 
  JOIN item ON sentence.sentenceid = item.sentenceid
  JOIN word ON item.wordid = word.wordid
  JOIN item AS next_item ON sentence.sentenceid = next_item.sentenceid
                        AND next_item.position = item.position + 1
  JOIN word AS next_word ON next_item.wordid = next_word.wordid
 WHERE word.spelling = 'word1'
   AND next_word.spelling = 'word2'

Bardziej ogólne rozwiązanie, wykorzystujące funkcje okien :

SELECT DISTINCT sentenceid
FROM (SELECT sentence.sentenceid,
             word.spelling,
             lead(word.spelling) OVER (PARTITION BY sentence.sentenceid
                                           ORDER BY item.position)
        FROM sentence 
        JOIN item ON sentence.sentenceid = item.sentenceid
        JOIN word ON item.wordid = word.wordid) AS pairs
 WHERE spelling = 'word1'
   AND lead = 'word2'

Edytuj :Również ogólne rozwiązanie (dozwolone przerwy), ale tylko z połączeniami:

SELECT DISTINCT sentence.sentenceid
  FROM sentence 
  JOIN item ON sentence.sentenceid = item.sentenceid
  JOIN word ON item.wordid = word.wordid
  JOIN item AS next_item ON sentence.sentenceid = next_item.sentenceid
                        AND next_item.position > item.position
  JOIN word AS next_word ON next_item.wordid = next_word.wordid
  LEFT JOIN item AS mediate_word ON sentence.sentenceid = mediate_word.sentenceid
                                AND mediate_word.position > item.position
                                AND mediate_word.position < next_item.position
 WHERE mediate_word.wordid IS NULL
   AND word.spelling = 'word1'
   AND next_word.spelling = 'word2'


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SELECT .. INTO, aby utworzyć tabelę w PL/pgSQL

  2. Znajdź przerwy w sekwencji w SQL bez tworzenia dodatkowych tabel

  3. Połącz wiele wierszy wyników z jednej kolumny w jedną, pogrupuj według innej kolumny

  4. PostreSQL 10 nie uruchamia się na Ubuntu 18.04 działającym na podsystemie Windows dla systemu Linux

  5. Skondensować lub zmienić numerację identyfikatorów dla wszystkich tabel i zresetować sekwencje do max(id)?