2014-02-21 31 views
0

假設我有一列'值',它可以出現在另一列'結果'可以是1或0的表中多次。我想搜索連續1s (即結果= 1),直到計數達到4,然後我可以選擇值。下面給出的結果集:sql如何獲得值的連續外觀

-result設置)

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

-result組B)

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

結果集B滿足條件,因此被選擇值A。我如何去做這件事?謝謝。

+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

嗨青色,我寫了一個類似的查詢,問題是,它只需要選擇A,如果結果= 1出現CONSECUTIVELY 4次,不只是得到大於4 –

+0

哎呀抱歉。我認爲你需要一個循環過程來做到這一點。 – cyan

+0

sql查詢已更新 – cyan

1

您可以在select語句中執行此操作。假設你有一個id,你可以使用row_number()找到連續的物品組。 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」(某種)? –