从使用(WHERE)条件选择的行中获取上一行和下一行

mah*_*efi 20 sql sql-server rows sql-server-2012

例如,我有这样的声明:

my name is Joseph and my father's name is Brian
Run Code Online (Sandbox Code Playgroud)

此语句按字分割,如下表所示:

------------------------------
|      ID      |   word      |
------------------------------
|       1      |   my        |
|       2      |   name      |
|       3      |   is        |
|       4      |   Joseph    |
|       5      |   and       |
|       6      |   my        |
|       7      |   father's  |
|       8      |   name      |
|       9      |   is        |
|       10     |   Brian     |
------------------------------
Run Code Online (Sandbox Code Playgroud)

我想得到每个单词的上一个和下一个单词

例如,我想获得"name"的上一个和下一个单词:

--------------------------
|    my    |  name  |  is |
--------------------------
| father's |  name  |  is |
--------------------------
Run Code Online (Sandbox Code Playgroud)

我怎么能得到这个结果?

a_h*_*ame 42

您没有指定DBMS,因此以下是ANSI SQL:

select prev_word, word, next_word
from (
    select id, 
           lag(word) over (order by id) as prev_word,
           word,
           lead(word) over (order by id) as next_word
    from words
) as t
where word = 'name';
Run Code Online (Sandbox Code Playgroud)

SQLFiddle:http://sqlfiddle.com/#!12/7639e/1


Nic*_*k P 8

为什么没有身体给出简单的答案?

SELECT LAG(word) OVER ( ORDER BY ID ) AS PreviousWord ,
       word ,
       LEAD(word) OVER ( ORDER BY ID ) AS NextWord
FROM   words;
Run Code Online (Sandbox Code Playgroud)

  • 您无法将结果限制为特定单词的下一个/上一个。接受的答案带有`WHERE`子句。 (2认同)

Wil*_*ill 6

没有子查询:

SELECT a.word 
FROM my_table AS a
JOIN my_table AS b 
ON b.word = 'name' AND abs(a.id - b.id) <= 1
ORDER BY a.id
Run Code Online (Sandbox Code Playgroud)

  • 如果id序列中有间隔,这将不起作用 (2认同)