【问题标题】:Alternate for LAG function in SQL Server 2005 to calculate growth rateSQL Server 2005 中用于计算增长率的 LAG 函数的替代方法
【发布时间】:2019-04-29 05:22:11
【问题描述】:

如何创建一个包含我的数据库增长率的列? 我有一个数据库并创建了另一个表(仅包含日期和计数字段),其中包含日期和记录总数。我还想插入另一列,其中包含我的增长百分比:

SELECT CONVERT(DATE, GETDATE()) AS Date, COUNT(*) AS Count
FROM [Database]

我的桌子是这样的:

Date        Count        Growth Rate
01/01/18    20.000,00
01/02/18    25.000,00    25,00%
01/03/18    40.000,00    60,00%

我用的是SQL Server 2005,所以不能使用滞后功能。我该怎么办?

【问题讨论】:

  • 如果您查看 MSDN 页面,LAG 直到 2012 年才起作用:docs.microsoft.com/en-us/sql/t-sql/functions/…。以前的方法是使用行号并自连接到同一个表 ON rowNum = rowNum - 1
  • 你能写出想要的输出吗?
  • @StepUp 我想从“计数”列的最后一行到当前行进行计算,将该数字转换为百分比并将其放入“增长率”列。如果计算是这样的:“(最后一行 - 当前行)/带有滞后函数的最后一行,它看起来像这样:100 *(count()-lag(count(),1 ) / lag (count (*), 1) || '%' 作为增长率

标签: sql sql-server sql-server-2005 lag window-functions


【解决方案1】:

您可以使用相关子查询来模拟 LAG 函数,如下所示:

WITH cte (Date, Count) AS (
    SELECT '2018-01-01', 20000.00 UNION
    SELECT '2018-01-02', 25000.00 UNION
    SELECT '2018-01-03', 40000.00
)
SELECT *, (
    SELECT TOP 1 Count
    FROM cte AS x
    WHERE Date < t.Date
    ORDER BY Date DESC
) AS PoorMansLag -- 100 * (Count / PoorMansLag - 1) gives you the result in OP
FROM cte AS t

【讨论】:

    【解决方案2】:

    另一种可能的方法:

    CREATE TABLE #LagTable (
        [Date] datetime,
        [Count] numeric(10, 2)
    
    )
    
    INSERT INTO #LagTable VALUES ('2018-01-01', 20000.00)
    INSERT INTO #LagTable VALUES ('2018-01-02', 25000.00)
    INSERT INTO #LagTable VALUES ('2018-01-03', 40000.00);
    
    WITH cte AS (
        SELECT [Date], [Count], ROW_NUMBER() OVER (ORDER BY [Date]) AS RN
        FROM #LagTable
    )
    SELECT 
        t1.[Date], 
        t1.[Count],
        (t1.[Count] - COALESCE(t2.[Count], 0)) / t2.[Count] * 100 AS GrowthRate
    FROM cte t1
    LEFT JOIN cte t2 ON (t1.RN = t2.RN + 1)
    

    输出:

    Date                    Count       GrowthRate
    2018-01-01 00:00:00.000 20000.00    NULL
    2018-02-01 00:00:00.000 25000.00    25.0000000000000
    2018-03-01 00:00:00.000 40000.00    60.0000000000000
    

    【讨论】:

      猜你喜欢
      • 2014-04-09
      • 1970-01-01
      • 2016-06-08
      • 2021-04-12
      • 1970-01-01
      • 2017-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多