2017-07-17 2 views
-1

例えば、私は、次の列を持つテーブルがある:SQL Server 2005 - 結果セットの同じ列内の2つの結果に対してローリング計算を実行するにはどうすればよいですか?

EXTRACT_DATE, TABLE_NAME, NUMBER_ROWS, DATA_SIZE. 

DATA_SIZE列がbigintデータ型であると私は別の列にサイズ差を取得するから別の値を減算していますよ。結果セットの最大行数は52行です。これは、2行の各セットに対して実行する必要があります。

私が使用すべきコードを教えてもらえますか?あなたがもっと情報を必要とするかどうかを教えてください。

サンプルデータ:

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 

各テーブルの複数の抽出物は、それぞれが一週間戻ってあります。 EXTRACT_DATEを想定し

の予想される出力

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

編集サンプルデータ、予想される出力と何をしようとしているが含まれるように、あなたの質問は、これまで – JohnHC

+0

また、あなたのデータベースのアップグレードを検討する必要があります。 2005年はMicrosoftによってサポートされなくなりました。 –

+0

残念ながら、それ以外のバージョンを使用するには、私は間違いなく後のバージョンを使用しています。 –

答えて

0

はユニークであり、それはあなたがあなたの結果がで設定されたご注文に使用する列ですが、あなたはおそらくこのような何か行うことができます:あなたが持っている希望の場合

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 

をDDL + DMLとしてサンプルデータを提供するだけでなく、私の答えをテストすることができます。

+0

私は期待通りの結果を得ることができませんでしたが、サンプルデータ/期待通りの結果を提供しています。私も私のソリューションを提供しました。これは非常に単純なようなものにとって非常に複雑です。 –

+0

サンプルデータと希望の結果との接続が見えません。また、サンプル・データを提供する場合は、DDL + DML(表の作成および挿入)として提供することをお薦めします。 –

0

私は2つのテンポラリテーブルを使用してそれぞれの値を使用してサイズの差を計算することができました。私はこれを行う最善の方法だとは言わないが、私がしたいことがうまくいくように思える。これを行う簡単な方法があるなら、私はまだそれを見るのが大好きです。

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 
関連する問題