Группа Похожие записи Sql Server 2008 - PullRequest
0 голосов
/ 27 октября 2009

Я напишу запрос для достижения чего-то вроде ниже:

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 и создать пакет записей. Важно отметить, что я должен поддерживать ПОСЛЕДОВАТЕЛЬНОСТЬ 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

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

Обновление:

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

Ответы [ 3 ]

1 голос
/ 27 октября 2009

Попробуй это. Довольно сложно, но работает. Я не тестировал его на таком количестве строк, но он перебирает таблицу только один раз.

Сначала нужно сделать предварительную подготовку.

-- 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
0 голосов
/ 27 октября 2009

Трудно сделать это без CURSORS или SQLCLR. Рассматриваете ли вы написание табличной функции в c # и добавление сборки в SQL Server? (SQLCLR) Это то, что я сделал бы, а затем я сделал бы цикл while, обрабатывая записи последовательно.

0 голосов
/ 27 октября 2009

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

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

увидимся.

...