2014-02-12 70 views
1

Microsoft SQL 2008SQL如何獲取記錄,直到一個記錄不同

我甚至不知道如何說出這句話,但我在這裏;我試圖獲得第一條記錄,標誌= 1,並且以下記錄直到下一個記錄標誌= 1,因此記錄1低谷5將是一組,記錄6和7另一組並且記錄8低谷10另一組。

RECORD FLAG 
1   1 
2   0 
3   0 
4   0 
5   0 
6   1 
7   0 
8   1 
9   0 
10   0 

我在想使用遊標,循環或類似的東西,但我不能讓它工作。

這是我曾嘗試:

DECLARE db_cursor CURSOR FOR 
SELECT RECORD,FLAG 
FROM TABLE 
WHERE FLAG = 1 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @Records 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    --HERE IM LOST-- HOW TO GET THE RECORDS THAT FOLLOW THE FIRST RECORD WITH FLAG=1 

    FETCH NEXT FROM db_cursor INTO @Records 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 
+0

什麼RDBMS和版本?期望的結果是什麼樣的?你想帶回所有10行。或者只是其中一組?如果是這樣的話? –

+1

你想用這些「集合」行來做什麼?難道你不能簡單地用遊標遍歷行並檢測哪些行是集合中的第一行來做特別的事情?如果第一行沒有FLAG = 1會怎麼樣? –

回答

5

您可以附加標識每個組記錄一個新的價值。這個新的值是flag累計總和:

這是標準的SQL,然後可以在任何查詢中使用。所以,如果你想在第一組,你可以這樣做:

select record, flag 
from (select t.*, 
      (select sum(t2.flag) 
       from table t2 
       where t2.record <= t.record 
      ) as grp 
     from table t 
    ) t 
where grp = 1 
order by record; 

SqlFiddle演示:http://sqlfiddle.com/#!3/40bf7/4

編輯:

你沒有提到的數據庫。在某些數據庫(Oracle,Teradata,DB2,Postgres和SQL Server 2012)中,您有累積和。它通常如下所示:

select t.*, sum(flag) over (order by record) as grp 
from table t 

此語法的功能相同。

+0

採取的方法+1(使用'flag'的累積'SUM') – Shiva