0

以下のようなものを達成するためのクエリを作成します。

テーブル名: アプリケーション

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_type に基づいて App_Id を順番にグループ化し、レコードのバッチを作成する必要があります。注意すべき重要な点は、バッチの作成中に 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

もう 1 つ、アプリケーション テーブルには 100 万件を超えるレコードが含まれる可能性があるため、クエリを最も効率的かつ最適化された方法で設計する必要があります。

アップデート:

現在、アプリケーション テーブル (上記の元の質問で定義) があり、アプリケーション テーブルのデータに基づいて ApplicationBatch テーブルにデータを入力したいと考えています。

4

3 に答える 3

1

これを試して。かなり複雑ですが動作します。それほど多くの行でテストしませんでしたが、テーブルを 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
于 2009-10-27T16:07:44.110 に答える
0

CURSORS または SQLCLR なしでこれを行うのは困難です。C# でテーブル値関数を作成し、アセンブリを SQL Server に埋め込むことを検討しますか? (SQLCLR) それが私がすることです。次に、レコードを順次処理する while ループを実行します。

于 2009-10-27T16:00:57.180 に答える
0

質問は明確ではありませんが、次のことは理解しています。

アプリケーションのシーケンスが必要で、それは別のテーブルに挿入された行数に依存しますか?

またね。

于 2009-10-27T15:41:55.130 に答える