作为学习sql项目的一部分,我下载了一个.csv格式的字典,并设置了一个表(其中一列包含307104个单词,称为“单词”)。我被一些问题困住了,它们是:“数据库”后面是什么词“数据库”后面的两个词是什么“数据库”前面是什么词“数据库”前面的两个词是什么我找不到与此类型的查询相关的关键字,任何帮助都将不胜感激。
dvtswwa31#
你可以用数字来列举单词 row_number() 在公共表表达式中(如果数据库支持这些功能),然后在外部查询中进行筛选:
row_number()
with cte as ( select word, row_number() over(order by word) rn from mytable )select c.wordfrom cte cwhere c.rn = ( select c1.rn from cte c1 where c1.word = 'database') + 1
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 ).另一个选项使用行限制查询。要获得下一个单词:
+ 1
- 2
select wordfrom mytablewhere word > 'database'order by wordlimit 1
select word
where word > 'database'
order by word
limit 1
单词后面有两个位置:
select wordfrom mytablewhere word > 'database'order by wordlimit 1, 1
limit 1, 1
前面的单词:
select wordfrom mytablewhere word < 'database'order by word desclimit 1
where word < 'database'
order by word desc
单词前面有两个位置:
select wordfrom mytablewhere word < 'database'order by word desclimit 1, 1
注意:行限制子句的语法因数据库而异。
mklgxw1f2#
您可以使用如下窗口函数 LAG() (对于“数据库”之前的单词)和 LEAD() (对于“database”后面的单词):
LAG()
LEAD()
select t.result from ( select columnname, lag(columnname, 1) over (order by (select null)) result from words) twhere t.columnname = 'Database'
select t.result
from (
select columnname, lag(columnname, 1) over (order by (select null)) result
from words
) t
where t.columnname = 'Database'
改变 columnname 列的名称。此查询返回“database”之前的单词,如果将1更改为2,则会得到“database”之前的单词2行。根据您的数据库,您可以省略 order by (select null) 从 over 条款。
columnname
order by (select null)
over
c3frrgcw3#
如果要在数据库后面添加单词:
select wordfrom dictionarywhere word > databaseorder by wordfetch first 1 row only;
from dictionary
where word > database
fetch first 1 row only;
后面的两个字:
select wordfrom dictionarywhere word > databaseorder by wordoffset 1 fetch first 1 row only;
offset 1 fetch first 1 row only;
对“before”的查询是相似的,但排序和比较是相反的。你可以开始喜欢使用窗口函数。例如,如果您需要从2 before到2 after的所有单词,可以使用windows计数:
select wordfrom (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 ) dwhere cnt_database > 0;
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) ,第一种方法会更快。
(word)
3条答案
按热度按时间dvtswwa31#
你可以用数字来列举单词
row_number()
在公共表表达式中(如果数据库支持这些功能),然后在外部查询中进行筛选:这会给你一个紧跟在“数据库”后面的词。你可以改变决赛
+ 1
要获得其他结果(例如,要获得单词前面的两个位置,可以使用- 2
).另一个选项使用行限制查询。
要获得下一个单词:
单词后面有两个位置:
前面的单词:
单词前面有两个位置:
注意:行限制子句的语法因数据库而异。
mklgxw1f2#
您可以使用如下窗口函数
LAG()
(对于“数据库”之前的单词)和LEAD()
(对于“database”后面的单词):改变
columnname
列的名称。此查询返回“database”之前的单词,如果将1更改为2,则会得到“database”之前的单词2行。
根据您的数据库,您可以省略
order by (select null)
从over
条款。c3frrgcw3#
如果要在数据库后面添加单词:
后面的两个字:
对“before”的查询是相似的,但排序和比较是相反的。
你可以开始喜欢使用窗口函数。例如,如果您需要从2 before到2 after的所有单词,可以使用windows计数:
但是,在索引打开的情况下
(word)
,第一种方法会更快。