2014-02-21 3 views
0

Предположим, у меня есть значение столбца, которое может появляться несколько раз в таблице с результатом другого столбца, который может быть равен 1 или 0. Я хотел бы искать последовательные 1s (т.е. результат = 1), пока счетчик не достигнет 4, тогда я могу выбрать значение. учитывая наборы результатов ниже:sql Как получить последовательный внешний вид значения

-result множество а)

value Result 
----- ------   
A  1 
A  1 
A  1 
A  0 

-result множество б)

value Result 
----- ------   
A  1 
A  1 
A  1 
A  1 

результирующий набор б удовлетворяет условию и, следовательно, выбрано значение А. Как мне это сделать? Благодарю.

+0

"подряд" в соответствии с предписанием, что? В таблице нет упорядочивания строк по умолчанию. –

+0

последовательный заказ по дате –

ответ

1

Это запрос: (как правило, этот запрос для обнаружения двойной записи в таблице, но, вероятно, удовлетворить ваш спрос).

select value, result, count(value) as [Result Sum] 
from @temp 
where result = 1 
group by value, result 
having count(value) >3 

Это результат

value result  Result Sum 
----- ----------- ----------- 
A  1   4 

ОБНОВЛЕНО:

Это пример данных в моей временной таблицы (@temp)

value result 
----- ----------- 
A  1 
A  1 
A  1 
A  0 
A  1 
D  1 
D  1 
D  1 
D  1 
B  1 
B  1 
C  1 
C  1 
C  1 
C  1 

Из примера данных C и D являются действительными значениями

Declare @temp2 table 
(
value nvarchar(5) 
) 
declare @value nvarchar(5), @result int, @total int, @flag bit, @tempValue nvarchar(5) 
DECLARE myCursor CURSOR FOR 
SELECT value, result 
FROM @temp 

set @flag = 1 
set @tempValue = '' 
OPEN myCursor; 
FETCH NEXT FROM myCursor into @value, @result; 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
    --logic here 

      if (@tempValue <> @value and @result = 1) or @flag = 1 
      begin 
       set @tempValue = @value 
       set @total = 1 
       set @flag = 0 
      end 
      else [email protected] = @value 
      begin 
       if @result = 1 
        set @total = @total + 1 
       else [email protected] = 0 
        set @flag = 1 

       if @total >3 --valid value has reached 4 consecutive result =1 
        begin 
         set @flag = 1 
         insert into @temp2 values (@value) 
        end 
      end 


    FETCH NEXT FROM myCursor into @value, @result; 

    END; 
CLOSE myCursor; 
DEALLOCATE myCursor; 

select * from @temp2 

Это результат выполнения цикла (таблица @ Temp2)

value 
----- 
D 
C 

(2 row(s) affected) 
+0

Привет, Cyan, я написал аналогичный запрос, проблема в том, что ему нужно только выбрать A, если результат = 1 появляется CONSECUTIVELY 4 раза, а не только число больше 4 –

+0

oops извините об этом. Я думаю, для этого вам нужен цикл. – cyan

+0

Запрос sql обновлен – cyan

1

Вы можете сделать это в операторе select. Вы можете найти группы элементов в строке, используя row_number(), если у вас есть id. SQL-таблицы по сути неупорядочены, поэтому вам нужно указать id или дату создания или что-то, что нужно для указания заказа. Вот SQL:

select value 
from (select t, 
      (row_number() over (partition by value order by id) - 
       row_number() over (partition by value, results order by id) 
      ) as grp 
     from table t 
    ) t 
group by value, result, grp 
having count(*) > 3 and result = 1; 
+0

Спасибо, Гордон. Я не понимаю часть «select t», так как вы извлекаете из «table t» ... также хотите упорядочить по дате, чтобы каждая строка имела связанную с ней строку даты. –

+0

@AndrisMudiayi. , , У вас есть «id» (какой-то) в ваших данных? –

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