2016-05-10 116 views
1

我是一個相對較新的SQL程序員,我試着讓下面的代碼在SQL中工作。代碼用於計算給定數據集的斜率,遵循與EXCEL SLOPE函數完全相同的邏輯。現在的問題是,因爲聚合被嵌套,所以不允許計數。但是,如果我創建一個計數和總和的子查詢,我將不得不在x和y上進行分組,否則我的外部查詢中不會有x和y計算。試圖使用SQL語法進行斜率計算工作

CREATE TABLE TEST (X FLOAT, Y FLOAT); 

INSERT INTO TEST (X, Y) VALUES (1,4.10242258729964); 
INSERT INTO TEST (X, Y) VALUES (2,4.57708865242591); 
INSERT INTO TEST (X, Y) VALUES (3,5.16785670619896); 
INSERT INTO TEST (X, Y) VALUES (4,6.88149559336059); 

select sum((x-sum(x)/count(x))^2)/sum(((x-sum(x)/count(x))*(y-sum(y)/count(y)))) 
from TEST 
+0

順便說一句,該數據庫是Netezza公司,而我在Aginity工作臺工作,所以你的很多普通的SQL的COM mands可能無法在這裏工作......謝謝。 –

回答

0

在這裏,你創建的SQL的工作版本:

SELECT sum((x-avgx)*(x-avgx))/sum((x-avgx)*(y-avgy)) 
FROM TEST, (SELECT sum(X)/count(X) as avgx, sum(Y)/count(Y) as avgy FROM TEST) average; 

我擡頭excel的斜率功能,它被定義有點不同:

SELECT sum((x-avgx)*(y-avgy))/sum((x-avgx)*(x-avgx)) 
FROM TEST, 
    (
     SELECT 
      sum(X)/count(X) as avgx, 
      sum(Y)/count(Y) as avgy 
     FROM TEST 
    ) average; 

希望這是你需要什麼:)

+0

只需要注意,您的「計劃B」選項會返回與我發佈的腳本完全相同的結果,也是「SQL Hacks」發佈的腳本;但您的「計劃A」選項的確帶有非常不同的答案。我認爲OP可能有Excel斜率有點錯誤? –

+0

TehSphinX,這正是我正在尋找的。我想將excel爲斜率函數定義的公式轉換爲SQL計算。我發現問題是我可以在同一個查詢中從不同的表中選擇一些東西。真棒回答,非常感謝你! –

1

您可以計算從總和斜率(X * X)和sum(X * Y)和AVG(x)和AVG(y)和N:

SELECT avg(x) AS mx,sum(x*x) AS sx2,sum(x*y) as sxy,avg(y) as my, count(x) AS n 
FROM test 

然後你可以使用:

SELECT (sxy-n*mx*my)/(sx2 - n* mx*mx) 
FROM 
( SELECT avg(x) AS mx,sum(x*x) AS sx2,sum(x*y) as sxy,avg(y) as my, count(x) AS n 
    FROM test 
) 
+0

喜SQL Hacks,非常感謝你的答案。你能解釋一下你的公式(sxy-n * mx * my)/(sx2-n * mx * mx)如何完成與我原來的邏輯相同的事情嗎? –

+0

有點代數... –

+0

這個公式是在http://www.zweigmedia.com/RealWorld/calctopic1/regression.html中給出的...大約在頁面下半部分,標題爲:迴歸(最適合)Line –

0

我通常沿着這些線路(我不停的語法儘可能簡單,以避免任何可能會出現問題,比如熱膨脹係數)的東西:

CREATE TABLE #test (x FLOAT, y FLOAT); 
INSERT INTO #test SELECT 1, 4.10242258729964; 
INSERT INTO #test SELECT 2, 4.57708865242591; 
INSERT INTO #test SELECT 3, 5.16785670619896; 
INSERT INTO #test SELECT 4, 6.88149559336059; 
SELECT 
    (N * SUM_XY - SUM_X * SUM_Y)/(N * SUM_X2 - SUM_X * SUM_X) AS slope 
FROM 
    (
    SELECT 
     COUNT(*) AS N, 
     SUM(x) AS SUM_X, 
     SUM(x * x) AS SUM_X2, 
     SUM(y) AS SUM_Y, 
     SUM(y * y) AS SUM_Y2, 
     SUM(x * y) AS SUM_XY 
    FROM 
     #test) a; 

只是跑了這個,然後注意到你有「SQL黑客」的另一個答案。我跑了兩個版本,他們得到確切同樣的答案,但其他版本更短:d

+0

Great , 謝謝! –