2009-10-27 72 views
0

我會寫一個查詢,以實現類似下面:組相似記錄SQL Server 2008中

表名:應用

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 

我有順序組APP_ID基於APP_TYPE和創建一批記錄。重要的一點是,我必須在創建批次時保持AppId的SEQUENCE。批次可以擁有的最大記錄數量取決於批量大小參數(例如現在將批量大小設置爲3)。創建批次後,將細節插入到名爲ApplicationBatch的其他表中。所以,我想輸出是這樣的:

表名: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 

還有一件事我要設計查詢在最佳效率和優化的方式,因爲申請表可以在它擁有超過百萬的記錄。

更新:

目前我有申請表(在我原來的問題上面定義的),我想基於從應用程序表中的數據來填充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