sql - 如何在SQL函数中计算不同的趋势线类型

标签 sql sql-server statistics trend trendline

我一直在寻找一种计算 Excel 的好方法,例如桌面应用程序仪表板图表的趋势线。

最常见的趋势类型一定是这样的

Type = 1 Linear Y = a + b*X
Type = 2 EXponential Y = a*e^(b*X)   
Type = 3 Logarithmic Y = a + b*ln(X)
Type = 4 Power Y = a*X^b

这就是我解决问题的方法。

最佳答案

正如我在其他评论中提到的,这可以写成内联 TVF,而不是多行 TVF。我从字面上理解了 OP 的解决方案,但是,一些 CTE 允许我们做到这一点:

CREATE FUNCTION dbo.tvf_TrendLine (@Type tinyint,
                                   @Rawdata XYTableType READONLY)
RETURNS TABLE
AS RETURN
    WITH xy AS(
    SELECT CONVERT(decimal(38,10),COUNT(*)) AS n,
           CONVERT(decimal(38,10),SUM(CASE WHEN @Type IN (3,4) THEN LOG(X) ELSE X END)) AS x,
           CONVERT(decimal(38,10),SUM(CASE WHEN @Type IN (3,4) THEN LOG(X) * LOG(X) ELSE X * X END)) AS x2,
           CONVERT(decimal(38,10),SUM(CASE WHEN @Type IN (2,4) THEN LOG(Y) ELSE Y END)) AS y,
           CONVERT(decimal(38,10),SUM(CASE WHEN @Type IN (2,4) THEN LOG(Y) * Y ELSE Y * Y END)) AS y2,
           CONVERT(decimal(38,10),SUM(CASE WHEN @Type = 2 THEN X * LOG(Y) WHEN @Type = 3 THEN LOG(X) * Y WHEN @Type = 4 THEN LOG(X) * LOG(Y) ELSE X * Y END)) AS xy
        FROM @RawData
        WHERE Y IS NOT NULL),
    ab AS(
        SELECT n,
               x,
               x2,
               y,
               Y2,
               xy,
               CONVERT(decimal(38,10),CASE WHEN @Type IN (2,4) THEN EXP((x2 * y - x * xy) / (n * x2 - x * x))
                                           ELSE (x2 * y - x * xy) / (n * x2 - x * x)
               END) AS a,
               CONVERT(decimal(38,10),(n * xy - x * y) / (n * x2 - x * x)) AS b
        FROM xy)
    SELECT rd.X,
           rd.Y,
           CASE
                WHEN @Type = 2 THEN ab.a * EXP(LOG(EXP(1)) * (ab.b * rd.X))
                WHEN @Type = 3 THEN ab.a + ab.b * LOG(rd.X)
                WHEN @Type = 4 THEN ab.a * EXP(LOG(rd.X) * ab.b)
                ELSE ab.a + ab.b * rd.X
           END AS Yt
    FROM @Rawdata rd
         CROSS JOIN ab;
GO

这返回的结果与OP的答案完全相同。

关于sql - 如何在SQL函数中计算不同的趋势线类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55849584/

相关文章:

sql - 如何获得删除的行数?

c# - 不使用 PIVOT 以逗号分隔的字符串形式查询结果?

sql - 字段不存在时求和

c# - sqlFileStream 系统.ComponentModel.Win32Exception : The request is not supported

spss - SPSS语法中如何读取小数?

javascript - 谷歌地图的插值方法

r - 如果可能,在 R - 基 R 中着色置信区间

java - mysql for java中的语句

Python - 按钮内的 IF 函数

sql - 从 FOR XML Sql 查询中解码文本