2016-08-11 1 views
0

テーブルの列からデータセットを取得したい。 私のシナリオは次のとおりです。 IAMがそのテーブルに名前「clm_Name」を使用した列、列のデータは、私がABC時にデータを取得したいこのSQLクエリを最適化して、Microsoft SQL Serverデータベースから特定のレコードセットを取得する

a 
b 
c 
a 
b 
c 
a 
b 
a 
b 
c 
a 
a 
b 
c 

のようなものですがあり、名前table1_dataを持つテーブルを持ちます(すなわち、もし与えられたデータに問い合わせを書くと、出力はabcabc ab abc a abcでなければなりません)。太字のみが出力に表示されます。

+1

を '行の値C 'bは?または、それは1つの行「a」、1つの行「b」、1つの行「c」ですか?後であれば、SQLでは、 'ORDER BY'を指定しない限り、 'before'、 'after'、 'first'などの概念は存在しないことに注意してください。 –

+4

SQLテーブルは、*順序付けられていない*セットを表します。順序を指定する列がなければ、あなたの質問は意味をなさない。 –

+0

「入力として注文」として使用するID列がありますか? –

答えて

1

あなたは次のようにあなたが行うことができますソートする列がある場合:

DECLARE @Tbl TABLE (OrderId INT, val NVARCHAR(1)) 

INSERT INTO @Tbl   
VALUES 
(1,'a'), 
(2,'b'), 
(3,'c'), 
(4,'a'), 
(5,'b'), 
(6,'c'), 
(7,'a'), 
(8,'b'), 
(9,'a'), 
(10,'b'), 
(11,'c'), 
(12,'a'), 
(13,'a'), 
(14,'b'), 
(15,'c') 


;WITH CTE 
AS 
( 
    SELECT 
     *, 
     ROW_NUMBER() OVER (ORDER BY (SELECT OrderId)) RowId 
    FROM @Tbl 
), Result 
AS 
(
    SELECT 
     CurrRow.RowId 
    FROM 
     CTE CurrRow LEFT JOIN 
     (SELECT CTE.val , CTE.RowId - 1 RowId FROM CTE) NextRow ON CurrRow.RowId = NextRow.RowId LEFT JOIN 
     (SELECT CTE.val , CTE.RowId + 1 RowId FROM CTE) PrivRow ON CurrRow.RowId = PrivRow.RowId 
    WHERE 
     PrivRow.val = 'a' AND 
     CurrRow.val = 'b' AND 
     NextRow.val = 'c' 
) 


SELECT 
    * 
FROM 
    CTE C 
WHERE 
    C.RowId IN ( 
        SELECT Result.RowId FROM Result 
        UNION ALL 
        SELECT Result.RowId - 1 FROM Result 
        UNION ALL 
        SELECT Result.RowId + 1 FROM Result 
       ) 
ORDER BY C.OrderId 

出力:

OrderId val RowId 
1  a 1 
2  b 2 
3  c 3 
4  a 4 
5  b 5 
6  c 6 
9  a 9 
10  b 10 
11  c 11 
13  a 13 
14  b 14 
15  c 15 
+1

本当にありがとう、ありがとうございました:) – userhi

+0

Sory私にとっては明らかではありません。もっと例を見せてもらえますか?下記のよう – NEER

+0

こんにちは@Neer が、私はちょうど別のシナリオに出くわした: I/P 「 B C X ** ** Y ** B ** Z ** C **」 O/P ' B C B C' はあなたが助けてもらえ私はこれで? – userhi

関連する問題