组类似记录Sql Server 2008

时间:2009-10-27 15:28:08

标签: sql sql-server sql-server-2008 batching

我将编写一个查询来实现以下内容:

TableName:应用程序

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。所以我想输出类似的东西:

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

我还有一件事要以最有效和最优化的方式设计查询,因为Application表中可以有超过百万条记录。

更新

目前我有Application表(在我上面的原始问题中定义),我想根据Application表中的数据填充ApplicationBatch表。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

问题不明确,但我理解下一个。

你想要一个aplication序列,这取决于在anohter表中插入的行数?

见到你。

答案 2 :(得分:0)

没有CURSORS或SQLCLR很难做到这一点。您会考虑在c#中编写一个表值函数并在SQL Server中使用该程序集吗? (SQLCLR) 这就是我要做的,然后我会做一个while循环处理记录的顺序。