2017-02-21 50 views
3

有沒有辦法僅提取包含type ='Email'的行之後的第一行?SQL Server:提取包含特定文本的行之後的行

樣品表:

id  type  details 
1 Email [email protected] 
2 1234 1234 
3 Email [email protected] 
4 12345 12345 
5 123456 123456 
6 Email [email protected] 
7 1234567  1234567 
8 12345678 12345678 
9 123456789 123456789 
10 Email [email protected] 
11 01  01 
12 Email [email protected] 
13 012  012 
14 Email [email protected] 
15

Python和熊貓,我會寫這樣的事情...

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

回答

3
select * 

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

     from t 
     ) t 

where prev_type = 'Email' 
+0

太棒了!感謝Dudu - 這很好。 –

+0

你是什麼意思的「滯後」......是否有關鍵字或任何東西? – Darshak

+0

lag是一個函數,你可以用它來獲得下一個值 –

1

對於像這樣的SQL Server查詢

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

我只是想要第一行,直接輸入=電子郵件 –

+0

後,你正在尋找這.. ..? – Darshak

+0

變暖,但對於類型爲'電子郵件'的所有條目。它應該類似於我在原始文章中的輸出。 –

1

如果是專門的電子郵件一行之後想只是第一個記錄,你可能會多一點選擇的是這樣的:

SELECT * FROM Table WHERE ID IN (SELECT ID+1 FROM Table where type='Email') 
+0

只是注意到你的領域被稱爲ID,抱歉,編輯! – Conrad

+0

謝謝康拉德!如果給出了一個ID,這很好,但如果沒有給出,會如何。有沒有一種廣義的方式來做到這一點? –

+0

你假設ID沒有差距 –

0

這裏是一個要工作,即使ID有差距的解決方案。它使用窗口函數。

---Sample data 
WITH data([id], [type] , [details]) AS 
(
    SELECT 1,'Email','[email protected]' UNION ALL 
    SELECT 2,'1234', '1234' UNION ALL 
    SELECT 3,'Email','[email protected]' UNION ALL 
    SELECT 4,'12345','12345' UNION ALL 
    SELECT 5,'123456', '123456' UNION ALL 
    SELECT 6,'Email','[email protected]' UNION ALL 
    SELECT 7,'1234567', '1234567' UNION ALL 
    SELECT 8,'12345678', '12345678' UNION ALL 
    SELECT 9,'123456789','123456789' UNION ALL 
    SELECT 10, 'Email','[email protected]' UNION ALL 
    SELECT 11, '01','01' UNION ALL 
    SELECT 12, 'Email','[email protected]' UNION ALL 
    SELECT 13 , '012', '012' UNION ALL 
    SELECT 14 ,'Email','[email protected]' 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') 
相關問題