【问题标题】:SQL Server 2005 - How do I do a rolling calculation on 2 results within the same column in a result-set?SQL Server 2005 - 如何对结果集中同一列中的 2 个结果进行滚动计算?
【发布时间】:2017-12-21 19:40:52
【问题描述】:

例如,我有一个包含以下列的表格:

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

【问题讨论】:

  • 编辑您的问题以包含示例数据、预期输出以及您迄今为止尝试过的内容
  • 您可能还需要考虑升级您的数据库。 Microsoft 不再支持 2005。
  • 不幸的是,我无法选择使用哪个版本,否则我肯定会使用更高版本。

标签: sql sql-server-2005


【解决方案1】:

假设 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 的形式提供示例数据以及所需的结果,我将能够测试我的答案。

【讨论】:

  • 我没能得到它得到预期的结果,但我已经提供了样本数据/预期的结果供你现在测试它。我也提供了我的解决方案,这对于看起来很简单的事情来说非常复杂。
  • 我看不到您的样本数据与所需结果之间的联系。另外,在提供示例数据时,最好以 DDL+DML(创建表和插入语句)的形式提供。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多