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

时间:2014-02-12 22:07:19

标签: 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

我正在考虑使用游标,循环或类似的东西,但我无法让它发挥作用。

以下是我的尝试:

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  

1 个答案:

答案 0 :(得分:5)

您可以附加标识每组记录的新值。此新值是flag

的累积总和
select t.*,
       (select sum(t2.flag)
        from table t2
        where t2.record <= t.record
       ) as grp
from table t;

这是标准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

这种语法做同样的事情。