2009-10-27 10 views
0

Je vais écrire une requête pour obtenir quelque chose comme ci-dessous:Group Notices similaires Sql Server 2008

TableName: Application

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 

Je dois séquentiellement groupe app_id basé sur APP_TYPE et créer un lot d'enregistrements . Le point important à noter est que je dois maintenir la SEQUENCE de AppId lors de la création des lots. Le nombre maximal d'enregistrements qu'un lot peut avoir dépend du paramètre de taille de lot (disons que la taille de lot est définie sur 3 pour l'instant). Une fois le lot créé, insérez les détails dans une autre table nommée ApplicationBatch. Donc, je veux une chose de sortie comme:

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 

une chose que je dois concevoir la requête d'une manière plus efficace et optimisé car la table d'application peut avoir plus de millions de disques en elle.

Mise à jour:

Actuellement, j'ai table Application (définie dans ma première question ci-dessus) et je veux remplir ApplicationBatch tableau à partir des données de la table d'application.

Répondre

0

la question n'est pas claire, mais je comprends la prochaine.

Vous voulez avoir une séquence pour l'application et cela dépend du nombre de lignes insérées dans une table anohter?

à bientôt.

0

Il est difficile de le faire sans CURSORS ou SQLCLR. Souhaitez-vous envisager d'écrire une fonction table dans C# et ambedding l'assembly dans SQL Server? (SQLCLR) C'est ce que je ferais, et ensuite je ferais une boucle en traitant les enregistrements séquentiellement.

1

Essayez ceci. Assez compliqué mais fonctionne. Je ne l'ai pas testé sur autant de lignes, mais il ne parcourt qu'une seule fois la table.

Premièrement, vous devez faire une pré-réservation.

-- 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 

et exécuter la requête:

-- the final query 
SELECT 
    BatchId, 
    MIN(AppId) AS MinAppId, 
    MAX(AppId) AS MaxAppId, 
    AppType 
FROM #tmpApp 
GROUP BY BatchId, AppType 
ORDER BY BatchId