2009-10-27 3 views
0

나는 다음과 같은 것을 달성하기 위해 쿼리를 작성됩니다그룹 비슷한 기록은 SQL Server 2008

TABLENAME : 응용 프로그램

내가 APP_TYPE에 따라 APP_ID 그룹을 순차적와 기록의 배치를 만들어야합니다
AppId (PK,int) AppType (bit) 
1    0 
2    0 
3    0 
4    0 
5    1 
6    0 
7    0 
8    0 
9    1 
10    1 
11    0 
12    0 
13    1 
14    0 
15    1 

. 중요한 점은 배치를 만드는 동안 AppId의 SEQUENCE를 유지해야한다는 것입니다. 일괄 처리가 가질 수있는 최대 레코드 수는 일괄 처리 크기 매개 변수에 달려 있습니다 (지금은 일괄 처리 크기를 3으로 설정). 일괄 처리가 생성되면 ApplicationBatch라는 다른 테이블에 세부 정보를 삽입합니다.

TABLENAME : 그래서 같은 출력 뭔가 원하는 ApplicationBatch

을 나는 응용 프로그램 테이블이 이상 만 개 기록을 가질 수 있기 때문에 가장 효율적이고 최적화 된 방법으로 쿼리를 디자인해야
BatchId MinAppId MaxAppId AppType 
001  1   3   0 
002  4   4   0 
003  5   5   1 
004  6   8   0 
005  9   10  1 
006  11  12  0 
007  13  13  1 
008  14  14  0 
009  15  15  1 

한 가지 더.

업데이트 :

는 현재 I (위 내 원래의 질문에 정의 된) 응용 프로그램 테이블이 나는 응용 프로그램 테이블에서 데이터를 기반으로 ApplicationBatch 테이블을 채우는 싶습니다.

답변

0

질문이 명확하지 않지만 다음을 이해합니다.

당신은 응용 프로그램을위한 시퀀스를 갖고 싶고 그것은 anohter 테이블에 삽입 된 라인의 수에 달려 있습니까?

참조.

0

CURSORS 또는 SQLCLR 없이는이 작업을 수행하기가 어렵습니다. C#에서 테이블 반환 함수를 작성하고 SQL Server에 어셈블리를 임베드하는 것을 고려 해볼까요? (SQLCLR) 그게 내가 할 것이라고, 그리고 난 while 루프를 레코드를 처리하는 반복 할 것이다.

1

시도해보십시오. 꽤 복잡하지만 작동합니다. 너무 많은 행에서 테스트하지는 않았지만 테이블을 한 번만 반복합니다.

먼저 전처리를해야합니다.

-- create temporary table 
CREATE TABLE #tmpApp(AppId INT, AppType BIT , BatchId INT) 

INSERT INTO #tmpApp(AppId,AppType) 
SELECT AppId, AppType FROM Application 

-- declare variables 
DECLARE @curId INT 
DECLARE @oldCurId INT 

DECLARE @appType INT 
DECLARE @oldAppType INT 

DECLARE @batchNo INT 
DECLARE @itemsInBatch INT 

SET @oldCurId = 0 
SET @batchNo = 1 
SET @itemsInBatch = 0 

SELECT TOP 1 
    @curId = AppId, 
    @appType = AppType 
FROM #tmpApp 
WHERE AppId > @oldCurId 
ORDER BY AppId 

WHILE @curId IS NOT NULL 
BEGIN 
    IF @oldAppType <> @appType OR @itemsInBatch >= 3 
    BEGIN 
     SET @batchNo = @batchNo + 1 
     SET @itemsInBatch = 0 
    END 

    SET @itemsInBatch = @itemsInBatch + 1 

    UPDATE #tmpApp 
    SET batchId = @batchNo 
    WHERE AppId = @curId 

    SET @oldCurId = @curId 
    SET @oldAppType = @appType 

    SET @curId = NULL 
    SELECT TOP 1 
     @curId = AppId, 
     @appType = AppType 
    FROM #tmpApp 
    WHERE AppId > @oldCurId 
    ORDER BY AppId 
END 

그리고 쿼리 실행 :

-- the final query 
SELECT 
    BatchId, 
    MIN(AppId) AS MinAppId, 
    MAX(AppId) AS MaxAppId, 
    AppType 
FROM #tmpApp 
GROUP BY BatchId, AppType 
ORDER BY BatchId