SQL Найти результат 1 поле под поиском - PullRequest
0 голосов
/ 18 июня 2020

В рамках проекта по изучению SQL я загрузил словарь в формате .csv и создал таблицу (1 столбец с 307 104 словами в нем под названием «Слова»).

I ' m застрял на некоторых запросах, а именно:

  • Какое слово идет после «База данных»
  • Какое слово идет через 2 слова после «База данных»
  • Какое слово идет перед 'Database'
  • Какое слово стоит на 2 слова перед 'Database'

Я не могу найти ключевое слово, относящееся к этому типу запроса, любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 18 июня 2020

Вы можете использовать такие оконные функции, как LAG() (для слов перед 'Database') и LEAD() (для слов после 'Database'):

select t.result 
from (
  select columnname, lag(columnname, 1) over (order by (select null)) result
  from words
) t
where t.columnname = 'Database'

Замените columnname на имя ваша колонка. Этот запрос возвращает слово перед словом «База данных», и если вы измените 1 на 2, вы получите слово на 2 строки перед «База данных». В зависимости от вашей базы данных вы можете опустить order by (select null) в предложении over.

0 голосов
/ 19 июня 2020

Если вы хотите, чтобы слово после базы данных:

select word
from dictionary
where word > database
order by word
fetch first 1 row only;

Для двух слов после:

select word
from dictionary
where word > database
order by word
offset 1 fetch first 1 row only;

Запросы для «до» аналогичны, но сортировка и сравнение в противоположных направлениях.

Можно начать фантазировать, используя оконные функции. Например, если вам нужны все слова от 2 до 2 после, вы можете использовать windows count:

select word
from (select d.*,
             sum(case when word = 'database' then 1 else 0 end) over (order by word range between 2 preceding and 2 following) as cnt_database
     from dictionary d
    ) d
where cnt_database > 0;

Однако с индексом на (word) первый подход будет будь быстрее.

0 голосов
/ 18 июня 2020

Вы можете перечислить слова с помощью row_number() в общем табличном выражении (если ваша база данных поддерживает эти функции), а затем выполнить фильтрацию во внешнем запросе:

with cte as (
    select word, row_number() over(order by word) rn
    from mytable 
)
select c.word
from cte c
where c.rn = (
    select c1.rn from cte c1 where c1.word = 'database'
) + 1

Это дает вам слово, которое следует сразу за "база данных". Вы можете изменить окончательный + 1, чтобы получить другие результаты (например, чтобы получить слово на две позиции раньше, вы должны использовать - 2).

Другой вариант использует запрос с ограничением строк.

Чтобы получить следующее слово:

select word
from mytable
where word > 'database'
order by word
limit 1

Слово на две позиции после:

select word
from mytable
where word > 'database'
order by word
limit 1, 1

Предыдущее слово:

select word
from mytable
where word < 'database'
order by word desc
limit 1

Слово на две позиции before:

select word
from mytable
where word < 'database'
order by word desc
limit 1, 1

Примечание: синтаксис предложения, ограничивающего количество строк, зависит от базы данных.

...