Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server 2005中用于计算增长率的滞后函数的替代项_Sql_Sql Server_Sql Server 2005_Lag_Window Functions - Fatal编程技术网

SQL Server 2005中用于计算增长率的滞后函数的替代项

SQL Server 2005中用于计算增长率的滞后函数的替代项,sql,sql-server,sql-server-2005,lag,window-functions,Sql,Sql Server,Sql Server 2005,Lag,Window Functions,我怎样才能创建一个具有数据库增长率的列? 我有一个数据库,并创建了另一个表,其中只包含日期和计数字段,其中包含日期和记录总数。我还想插入另一列,列出我的增长百分比: 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,0

我怎样才能创建一个具有数据库增长率的列? 我有一个数据库,并创建了另一个表,其中只包含日期和计数字段,其中包含日期和记录总数。我还想插入另一列,列出我的增长百分比:

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%

我使用SQLServer2005,因为这不能使用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

另一种可能的办法:

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

如果您查看MSDN页面,LAG直到2012年才成为一个函数:。之前的方法是使用一个行号,并在rowNum=rowNum-1上自连接到同一个表,您是否可以写入所需的输出?@steppup我想从“Count”列的最后一行计算到当前一行,将该数字转换为百分比,并将其放入“Growth Rate”列。如果计算是这样的:最后一行-当前行/最后一行,带有滞后函数,它看起来是这样的:100*计数-滞后计数,1/滞后计数*,1 | |“%”作为增长率