Microsoft SQL 2008

我甚至不知道该如何措辞,但我想说的是:我想获得第一条标志=1的记录,以及接下来的记录,直到下一条记录标志=1,所以记录1到5是一组,记录6和7是另一组,记录8到10是另一组。

RECORD  FLAG
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  
CLOSE db_cursor   
DEALLOCATE db_cursor  
    
2 个评论
什么RDBMS和版本?希望的结果是什么样子的?你想把所有的10行都带回来。还是仅仅是其中的一组?如果是的话,是哪一个?
你想对这些 "集合 "的行做什么?难道你不能简单地用游标在这些行上循环,并检测哪些行是一组中的第一行,从而做一些特别的事情吗?如果第一行没有FLAG=1怎么办?
sql
sql-server
sql-server-2008
RicEspn
RicEspn
发布于 2014-02-13
1 个回答
Gordon Linoff
Gordon Linoff
发布于 2014-02-13
0 人赞同

你可以附加一个新的数值,以识别每组记录。 这个新值是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
where grp = 1
order by record;

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

EDIT:

你没有提到数据库。 在一些数据库(Oracle、Teradata、DB2、Postgres和SQL Server 2012)中,你有一个累积和。 它通常看起来像这样。