我将编写一个查询来实现以下内容:
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表。
答案 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循环处理记录的顺序。