2017-07-17 5 views
-1

Par exemple, j'ai une table avec les colonnes suivantes:SQL Server 2005 - Comment faire un calcul de roulement sur 2 résultats dans la même colonne dans un ensemble de résultats?

EXTRACT_DATE, TABLE_NAME, NUMBER_ROWS, DATA_SIZE. 

La colonne DATA_SIZE est un type de données bigint et je cherche à soustraire une valeur d'une autre pour obtenir la différence de taille dans une colonne séparée. Le nombre maximal de lignes pour le jeu de résultats est de 52 lignes et cela doit être fait pour chaque ensemble de deux lignes.

Quelqu'un peut-il m'aider avec le code que je devrais utiliser? Faites-moi savoir si vous avez besoin de plus d'informations.

données Exemple:

EXTRACT_DATE TABLE_NAME NUMBER_ROWS DATA_SIZE 
2014-07-17  FGDISD  1   24576 
2014-07-17  FFIDXH  1   24576 
2014-07-17  FFIIRH  37   28672 

Il y a plusieurs extraits pour chaque table, chacun va revenir une semaine.

Sortie prévue

EXTRACT_DATE TABLE_NAME NUMBER_ROWS DATA_SIZE SIZE_DIFF 
2017-07-15  FGLEDG  141673883 76221730816 184553472 
2017-07-08  FGLEDG  141323505 76037177344 184549376 
2017-07-01  FGLEDG  140971673 75852627968 184549376 
+1

Modifier votre question pour inclure des données échantillon, sortie prévu et ce que vous avez essayé jusqu'à présent – JohnHC

+0

Vous pouvez également envisager d'améliorer votre base de données. 2005 n'est plus supporté par Microsoft. –

+0

Malheureusement, je n'ai pas le choix de la version à utiliser, sinon j'utiliserais certainement une version plus récente. –

Répondre

0

En supposant EXTRACT_DATE est unique, et il est la colonne que vous utilisez pour commander votre jeu de résultats par, vous pouvez probablement faire quelque chose comme ceci:

SELECT EXTRACT_DATE, 
     TABLE_NAME, 
     NUMBER_ROWS, 
     DATA_SIZE, 
     DATA_SIZE - 
     ISNULL((
      SELECT TOP 1 DATA_SIZE 
      FROM TableName as t1 
      WHERE t1.TABLE_NAME = t0.TABLE_NAME 
      AND t1.EXTRACT_DATE < t0.EXTRACT_DATE 
      ORDER BY EXTRACT_DATE DESC 
     ), 0) As DATA_SIZE_DIFF 
FROM TableName as t0 

Si vous avez fourni des données d'échantillon comme DDL + DML ainsi que les résultats souhaités, je serais en mesure de tester ma réponse.

+0

Je n'ai pas réussi à obtenir les résultats attendus, mais j'ai fourni des exemples de données/résultats attendus pour que vous puissiez les tester maintenant. J'ai également fourni ma solution, ce qui est très compliqué pour quelque chose qui semble si simple. –

+0

Je ne parviens pas à voir la connexion entre vos données d'échantillon et les résultats souhaités. De même, lorsque vous fournissez des exemples de données, il est préférable de les fournir en tant que DDL + DML (Créer une table et Insérer des instructions). –

0

J'ai été capable de résoudre ma question en utilisant deux tables temporaires et en utilisant les valeurs dans chacun d'eux pour calculer la différence de taille. Je ne dirais pas que c'est la meilleure façon de faire cela, mais cela semble fonctionner pour ce que je veux faire. S'il y a une façon plus simple de le faire, j'aimerais toujours le voir.

ALTER PROCEDURE [dbo].[TableGrowthReport] 
@NoOWeeks int, 
@TableName varchar(15) 

AS 
--Declares & sets variables 
DECLARE @CurrentDate DATETIME 
DECLARE @CalcDate DATETIME 

SET @CurrentDate = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) 
SET @CalcDate = DATEADD(ww, @NoOWeeks, @CurrentDate) 

CREATE TABLE #Data 
(
    RowNo int, 
    EXTRACT_DATE varchar(19), 
    TABLE_NAME varchar(128), 
    NUMBER_ROWS bigint, 
    DATA_SIZE bigint, 
    DATA_SIZE2 bigint, 
); 

CREATE TABLE #Data2 
(
    RowNo int, 
    DATA_SIZE2 bigint 
); 

INSERT INTO #Data 
    (RowNo, 
    EXTRACT_DATE, 
    TABLE_NAME, 
    NUMBER_ROWS, 
    DATA_SIZE, 
    DATA_SIZE2) 
    SELECT 
     ROW_NUMBER() OVER (ORDER BY EXTRACT_DATE desc) as RowNo, 
     EXTRACT_DATE, 
     TABLE_NAME, 
     NUMBER_ROWS, 
     DATA_SIZE, 
     NULL 
    FROM M3Rows_PF 
    WHERE TABLE_NAME = @TableName 
     AND EXTRACT_DATE > 
      (SELECT CONVERT(varchar(10), @CalcDate, 20)); 

INSERT INTO #Data2 
    (RowNo, 
    DATA_SIZE2) 
     SELECT 
      RowNo, 
      DATA_SIZE 
     FROM 
      (
       SELECT 
       ROW_NUMBER() OVER (ORDER BY EXTRACT_DATE desc) - 1 as RowNo, 
       EXTRACT_DATE, 
       TABLE_NAME, 
       NUMBER_ROWS, 
       DATA_SIZE 
       FROM M3Rows_PF 
       WHERE TABLE_NAME = @TableName 
        AND EXTRACT_DATE > 
         (SELECT CONVERT(varchar(10), @CalcDate, 20)) 
         )r 
         WHERE rowno > 0; 

UPDATE a 
SET DATA_SIZE2 = b.DATA_SIZE2 
FROM #Data a 
JOIN #Data2 b ON a.RowNo = b.RowNo 
WHERE a.RowNo = b.RowNo 

SELECT 
    RowNo, 
    EXTRACT_DATE, 
    TABLE_NAME, 
    NUMBER_ROWS, 
    DATA_SIZE, 
    DATA_SIZE2, 
    CASE 
     WHEN DATA_SIZE > 0 AND DATA_SIZE < 10000000 
      THEN LEFT(DATA_SIZE * 1.0/10000, 4) + 'kb' 
     WHEN DATA_SIZE >= 10000000 AND DATA_SIZE < 1000000000 
      THEN LEFT(DATA_SIZE * 1.0/1000000, 5) + 'mb' 
     ELSE 
      LEFT(DATA_SIZE * 1.0/1000000000, 5) + 'gb' END AS DATA_SIZECONV, 
    DATA_SIZE - DATA_SIZE2 AS SIZE_DIFF, 
    LEFT((DATA_SIZE - DATA_SIZE2) * 1.0/1000000, 5) AS SIZE_DIFFmb 
FROM #data 
WHERE TABLE_NAME = @TableName 
    AND EXTRACT_DATE > 
     (SELECT 
      CONVERT(varchar(10), @CalcDate, 20) 
     ) 

DROP TABLE #Data 
DROP TABLE #Data2