SQL Server:提取包含特定文本的行之后的行

3

有没有办法仅提取紧接着包含type = 'Email'的行之后的第一行?

样例表格:

id     type      details
1   Email   admin@sqlfiddle.com
2   1234    1234
3   Email   orange@hotmail.com
4   12345   12345
5   123456  123456
6   Email   cake@hotmail.com
7   1234567     1234567
8   12345678    12345678
9   123456789   123456789
10  Email   lala@gmail.com
11  01      01
12  Email   apple@yahoo.ca
13  012     012
14  Email   red@gmail.com
15  0123    0123

使用Python和Pandas,我会写出如下代码...
indexes = table[table['type']=='Email'].index + 1
table = table.ix[indexes]

输出结果将会是什么...

2   1234    1234
4   12345   12345
7   1234567     1234567
11  01  01
13  012     012
15  0123    0123
4个回答

3
select  *

from   (select  *
               ,lag (type) over (order by id) as prev_type

        from    t
        ) t

where   prev_type = 'Email'

“Lag”是什么意思?有关键字或其他东西吗? - Darshak
延迟是一个函数,您可以使用它来获取下一个值。 - Riley Hun
来自前一个行的值 - David דודו Markovitz
@DuduMarkovitz:兄弟,你太棒了...今天你教会了我一课。 - Darshak

1

对于像这样的SQL Server查询

select * from table where id in (Select id+1 from Table where type='Email')

我只想要在 type = Email 之后直接出现的第一行数据。 - Riley Hun
越来越接近了,但对于所有类型为“电子邮件”的条目。它应该类似于我在原始帖子中的输出。 - Riley Hun
我希望这能帮到你? - Darshak
1
您正在假设id没有间隙。 - David דודו Markovitz
感谢Darshak - 如果提供了ID,则有效。但是如果不存在该列或ID为字符串(如“AB7007”)怎么办? - Riley Hun
显示剩余6条评论

1
如果您只想获取电子邮件行后的第一条记录,可以更加精确地选择,例如:
SELECT * FROM Table WHERE ID IN (SELECT ID+1 FROM Table where type='Email') 

刚注意到你的字段叫做ID,抱歉,已经修改了! - Conrad
谢谢Conrad!如果给定了ID,这个方法非常好用,但是如果没有给定ID,有没有一种通用的方法来做到这一点呢? - Riley Hun
你假设id没有间隙。 - David דודו Markovitz
实际数据的ID是一个字符串,例如“AB7897”。 - Riley Hun

0

这里有一个解决方案,即使ID存在间隙也应该可以工作。它使用窗口函数。

---Sample data
WITH data([id], [type] , [details]) AS
(
    SELECT 1,'Email','admin@sqlfiddle.com' UNION ALL
    SELECT 2,'1234', '1234' UNION ALL
    SELECT 3,'Email','orange@hotmail.com' UNION ALL
    SELECT 4,'12345','12345' UNION ALL
    SELECT 5,'123456',  '123456' UNION ALL
    SELECT 6,'Email','cake@hotmail.com' UNION ALL
    SELECT 7,'1234567',  '1234567' UNION ALL
    SELECT 8,'12345678', '12345678' UNION ALL
    SELECT 9,'123456789','123456789' UNION ALL
    SELECT 10,  'Email','lala@gmail.com' UNION ALL
    SELECT 11,  '01','01' UNION ALL
    SELECT 12,  'Email','apple@yahoo.ca' UNION ALL
    SELECT 13 , '012',  '012' UNION ALL
    SELECT 14  ,'Email','red@gmail.com' UNION ALL
    SELECT 15  ,'0123', '0123'
),
---temporary table to hold row numbers
tbl([Row_Num], [id], [type]) AS
(
    SELECT (ROW_NUMBER() OVER (ORDER BY [id])) AS [Row_Num] ,[id],[type] FROM data 
)

---actual query using both tables
SELECT 
    d.[id], 
    d.[type], 
    d.[details] 
FROM [data] d 

INNER JOIN

[tbl] t

ON d.[id] = t.[id] 

WHERE t.[Row_Num] IN (SELECT Row_Num + 1 FROM tbl WHERE [type] = 'Email')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接