2009-10-27 3 views
0

Я буду писать запрос для чего-то добиться, как показано ниже:Group Подобных записей Sql Server 2008

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_ID на основе APP_TYPE и создать партию записей , Важно отметить, что я должен поддерживать SEQUENCE of AppId при создании пакетов. Максимальное количество записей, которые может иметь пакет, зависит от параметра размера партии (например, размер пакета до 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 

Еще одна вещь, которую я должен разработать запрос в лучшем эффективным и оптимизированным способом, так как таблица Приложение может иметь более миллиона записей в ней.

Update:

В настоящее время у меня есть таблица приложений (определенная в моем оригинальном вопросе выше), и я хочу, чтобы заполнить ApplicationBatch таблицы на основе данных из таблицы приложений.

ответ

0

вопрос непонятный, но я понимаю следующий.

Вы хотите иметь последовательность для применения и которая зависит от количества строк, вставленных в таблицу anohter?

Увидимся.

0

Трудно сделать это без КУРСОРОВ или 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