2017-07-17 28 views
-1

例如,我有下面的表:SQL Server 2005 - 如何對結果集中同一列內的2個結果執行滾動計算?

EXTRACT_DATE, TABLE_NAME, NUMBER_ROWS, DATA_SIZE. 

DATA_SIZE列是bigint數據類型和我期待減去另一個值以得到一個單獨的列的大小差異。結果集的最大行數爲52行,並且必須爲每個兩行的集合執行此操作。

有人可以幫我用我應該使用的代碼嗎?讓我知道你是否需要更多信息。

的樣本數據:

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

您可能還需要考慮升級您的數據庫。 Microsoft不再支持2005年。 –

+0

不幸的是,我沒有選擇使用什麼版本,否則我肯定會使用更高版本。 –

回答

0

假設EXTRACT_DATE是獨特的,它是你用來訂購您的結果集由列,你也許可以做這樣的事情:

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

我已經能夠解決我的問題,使用兩個臨時表,並使用它們中的每個值來計算大小差異。我不會說這是做這件事的最好方法,但它似乎適用於我想要做的事情。如果有這樣一個更簡單的方法,我仍然很想看到它。

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 
相關問題