2016-07-26 29 views
0

,如果你有這樣的:模式在SQL

text 
result 
measure 
text 
measure 
result 
text 
result 
text 
measure 
text 
measure 
result 
text 
measure 
text 

你怎麼能提取每個測量和2個文本之間產生,確定我提取的結果和我想的措施,並將它們存儲在變量,但我能做在那裏我有:

text 
measure 
text 

,我想提取的結果在這種情況下NULL ....

+3

SQL表示*無序*集。鑑於這個事實,你的問題完全不清楚 - 這似乎取決於價值的排序。 –

+0

首先,您向我們展示的表格片段有點毫無意義,因爲沒有列來指定訂單,並且您得到的答案几乎肯定會與訂單相關。其次,您可能更容易在另一個工具中執行此操作。 –

+0

我從文本文件中提取值並將它們插入到我的表格中,是的,我知道在另一個工具中它會更容易,但很遺憾,我沒有這個選擇 –

回答

1

如果你從一個文本文件中提取數據中,那麼你最好的選擇是可能要設置

DECLARE @table TABLE 
     (RowNum INT IDENTITY 
     ,val VARCHAR(36)); 

INSERT INTO @table 
VALUES ('text'), 
     ('result'), 
     ('measure'), 
     ('text'), 
     ('measure'), 
     ('result'), 
     ('text'), 
     ('result'), 
     ('text'), 
     ('measure'), 
     ('text'), 
     ('measure'), 
     ('result'), 
     ('text'), 
     ('measure'), 
     ('text'); 

結果表然後將這個樣子:多達你讓你加載它導入到具有標識字段的表,該值按順序分配一個編號

RowNum val 
1 text 
2 result 
3 measure 
4 text 
5 measure 
6 result 
7 text 
8 result 
9 text 
10 measure 
11 text 
12 measure 
13 result 
14 text 
15 measure 
16 text 

從那裏我們可以去找到文本之間的結果和措施。

SELECT Results.Result 
     ,Measures.Measure 
FROM ((
      SELECT RowNum AS Start FROM @table WHERE val = 'text' 
     ) AS A 
     OUTER APPLY (
         SELECT TOP 1 RowNum AS [End] 
         FROM  @table endTab 
         WHERE  val = 'text' 
           AND A.Start < endTab.RowNum 
         ORDER BY RowNum 
        ) AS B 
     OUTER APPLY (
         SELECT TOP 1 
           val AS Result 
         FROM  @table resultTab 
         WHERE  val = 'result' 
           AND resultTab.RowNum BETWEEN A.Start AND B.[End] 
        ) AS Results 
     OUTER APPLY (
         SELECT TOP 1 
           val AS Measure 
         FROM  @table measureTab 
         WHERE  val = 'measure' 
           AND measureTab.RowNum BETWEEN A.Start AND B.[End] 
        ) AS Measures); 

首先,我們需要得到每個文本記錄的位置和它的下面的文本記錄。然後我們可以在開始和結束時查找第一個Result記錄和Measure記錄。

Result Measure 
result measure 
result measure 
result NULL 
NULL measure 
result measure 
NULL measure