2009-10-27 74 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