2015-08-03 4 views
0

Я хочу написать запрос, чтобы найти запрос 2 period s для каждого site, который utilization_rate меньше, чем 50.Найти последовательные записи с критериями

Таблица:

ID Name Period Utilization_Rate 
------------------------------------ 
1 Site 1 2014-R1 40 
2 Site 1 2014-R2 30 
3 Site 1 2014-R3 25 
4 Site 2 2014-R1 30 
5 Site 2 2014-R2 20 
6 Site 2 2014-R2 60 
7 Site 3 2014-R2 30 
8 Site 3 2014-R2 70 
9 Site 3 2014-R2 40 

Ожидаемый результат:

ID Name Period Utilization_Rate 
------------------------------------ 
1 Site 1 2014-R1 40 
2 Site 1 2014-R2 30 
3 Site 1 2014-R3 25 
4 Site 2 2014-R1 30 
5 Site 2 2014-R2 20 
+2

Ваш вопрос остается неясным. Как вы получаете ожидаемые результаты? Например, почему в списке нет «3», но не «9»? –

+0

@GordonLinoff Я думаю, что «3» включен, потому что он следует за «2» и использует <50 на обоих. Строка «9» отсутствует в списке, потому что строка «8» отсутствует в списке, это ее сосед в исходных данных. По той же причине, что «5» и «7» отсутствуют (из-за «6» не квалифицируются). – Turophile

ответ

1

Я думаю, что вы хотите, чтобы все пары строк (на основе период и сайт), где оба коэффициента использования является менее 50.

Если это так, вы можете использовать lead() и lag():

select t.* 
from (select t.*, 
      lag(utilization_rate) over (partition by name order by period) as prev_ur, 
      lead(utilization_rate) over (partition by name order by period) as next_ur, 
     from tbl t 
    ) t 
where utilization_rate < 50 and (prev_ur < 50 or next_ur < 50); 

Эти функции доступны в SQL Server 2012+. Если вы используете более раннюю версию, вы можете сделать что-то подобное с коррелированными подзапросами или outer apply.

SQL Fiddle

+0

Вам не нужно разбивать на 'period'. –

+0

@FelixPamittan. , , Спасибо за это наблюдение. –

+0

Спасибо за ваш быстрый ответ и дайте мне правильный ответ. Как отредактировать запрос, чтобы найти более двух последовательных периодов – tony

2

Вот версия OUTER APPLY ответа Гордона:

SQL Fiddle

SELECT t.* 
FROM tbl t 
OUTER APPLY(
    SELECT TOP 1 * 
    FROM tbl 
    WHERE 
     Name = t.Name 
     AND ID < t.ID 
    ORDER BY ID DESC 
)p 
OUTER APPLY(
    SELECT TOP 1 * 
    FROM tbl 
    WHERE 
     Name = t.Name 
     AND Id > t.ID 
    ORDER BY ID ASC 
)n 
WHERE 
    t.Utilization_Rate < 50 
    AND (p.Utilization_Rate < 50 OR n.Utilization_Rate < 50) 
+0

Спасибо за ваш быстрый ответ и дайте мне правильный ответ. Как отредактировать запрос, чтобы найти более двух последовательных периодов – tony

0

же запрос с использованием простой старый присоединяется

select t.* from 
tbl t 
left join tbl tp on t.id-1=tp.id and t.name=tp.name 
left join tbl tn on t.id+1=tn.id and t.name=tn.name 
where t.utilization_rate < 50 and 
( 
    ISNULL(tp.utilization_rate,0) < 50 or ISNULL(tn.utilization_rate,0) < 50 
) 
+0

Проблема здесь в том, что есть пробел в 'id', ваш запрос может завершиться неудачно. –

Смежные вопросы