2014-02-12 6 views
1

마이크로 소프트 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

당신은 각 레코드 그룹을 식별하는 새로운 가치를 부여 할 수 있습니다.

이 표준 SQL 된 후 어떤 쿼리에 사용할 수 있습니다 :이 새로운 값은 flag의 누적 합계입니다. 첫 번째 그룹을 원한다면, 당신은 할 수 있습니다 :

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 (누적 된'SUM'의'flag' 사용) – Shiva