модели в sql-sql, sql-server-2008

ако имате нещо като:

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

как може да извлечете всяка мярка и резултат между 2 текста, добре аз извлечени резултатите и мерките, които искам и ги съхранява в променливи, но какво мога да направя, когато имам:

text
measure
text

и бих искал да извлече резултата като NULL в този случай ....

Отговори:

1 за отговор № 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  NULL
NULL    measure
result  measure
NULL    measure