SQL如何在一条记录不同之前获取记录

Ric*_*spn 2 sql sql-server sql-server-2008

Microsoft SQL 2008

我甚至不知道怎么说这个,但是我走了; 我试图获得flag = 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
Run Code Online (Sandbox Code Playgroud)

我正在考虑使用游标,循环或类似的东西,但我不能让它工作.

这是我尝试过的:

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  
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 6

您可以附加标识每组记录的新值.这个新值是累计和flag:

select t.*,
       (select sum(t2.flag)
        from table t2
        where t2.record <= t.record
       ) as grp
from table t;
Run Code Online (Sandbox Code Playgroud)

这是标准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;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

这种语法做同样的事情.