2017-02-21 4 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

ラグは、次の値を取得するために使用できる関数です –

1

このようなSQL Serverクエリの場合

0あなたは、特に電子メールの行の後だけで最初のレコードを望んでいる場合は
+0

私はちょうどタイプ=電子メール –

+0

の直後に来る最初の行をしたいですか? – Darshak

+0

暖かくなっていますが、type = 'Email'のすべてのエントリに対してです。それは私の元の投稿にある出力に似ているはずです。 –

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') 
関連する問題