2012-01-31 24 views
12

斜率我有一些數據在一個SQL數據庫,我想計算斜率。該數據具有這樣的佈局:如何計算在SQL

Date  | Keyword | Score  
2012-01-10 | ipad  | 0.12  
2012-01-11 | ipad  | 0.17  
2012-01-12 | ipad  | 0.24  
2012-01-10 | taco  | 0.19  
2012-01-11 | taco  | 0.34  
2012-01-12 | taco  | 0.45  

想我最終輸出看起來像這樣通過使用SQL創建新表:

Date  | Keyword | Score | Slope  
2012-01-10 | ipad  | 0.12 | 0.06  
2012-01-11 | ipad  | 0.17 | 0.06  
2012-01-12 | ipad  | 0.24 | 0.06  
2012-01-10 | taco  | 0.19 | 0.13  
2012-01-11 | taco  | 0.34 | 0.13  
2012-01-12 | taco  | 0.45 | 0.13 

更爲複雜的是,不是所有的關鍵詞有3個日期的價值的數據,有些只有2例如。

越簡單SQL的更好,因爲我的數據庫是專有的,我不太清楚什麼公式是可用的,雖然我知道它可以做OVER(PARTITION BY)是否有幫助。謝謝!

更新:我定義斜率的最佳擬合表達式y = mx + P在Excel又名這將是=斜率()

下面是另一個實際的例子,我通常在Excel操縱:

date  keyword   score  slope 
1/22/2012 water bottle 0.010885442 0.000334784 
1/23/2012 water bottle 0.011203949 0.000334784 
1/24/2012 water bottle 0.008460835 0.000334784 
1/25/2012 water bottle 0.010363991 0.000334784 
1/26/2012 water bottle 0.011800716 0.000334784 
1/27/2012 water bottle 0.012948411 0.000334784 
1/28/2012 water bottle 0.012732459 0.000334784 
1/29/2012 water bottle 0.011682568 0.000334784 
+5

看看在SQL線性迴歸這個問題。 http://stackoverflow.com/questions/2536895/are-there-any-linear-regression-function-in-sql-server – 2012-01-31 18:19:45

+2

@datayoda - 你是如何定義的斜率?如果您有兩個以上的數據點,您是否剛剛從最早的點到最近的點取斜率?或者你是否試圖在所有點之間畫一條最合適的線?如果是這樣,使用線性最小二乘法或其他算法?你是否想強制這條線擊中其中一個點(知道這會降低整體合體的好處)? – 2012-01-31 18:21:09

+2

Oracle中有一些線性迴歸函數。 http://docs.oracle.com/cd/B10501_01/server。920/a96540/functions101a.htm#85925 – 2012-01-31 18:24:41

回答

12

最乾淨的一個我可以做:

SELECT 
    Scores.Date, Scores.Keyword, Scores.Score, 
    (N * Sum_XY - Sum_X * Sum_Y)/(N * Sum_X2 - Sum_X * Sum_X) AS Slope 
FROM Scores 
INNER JOIN (
    SELECT 
     Keyword, 
     COUNT(*) AS N, 
     SUM(CAST(Date as float)) AS Sum_X, 
     SUM(CAST(Date as float) * CAST(Date as float)) AS Sum_X2, 
     SUM(Score) AS Sum_Y, 
     SUM(Score*Score) AS Sum_Y2, 
     SUM(CAST(Date as float) * Score) AS Sum_XY 
    FROM Scores 
    GROUP BY Keyword 
) G ON G.Keyword = Scores.Keyword; 

它使用Simple Linear Regression計算斜率。

結果:

Date   Keyword  Score   Slope 
2012-01-22 water bottle 0,010885442 0,000334784345222076 
2012-01-23 water bottle 0,011203949 0,000334784345222076 
2012-01-24 water bottle 0,008460835 0,000334784345222076 
2012-01-25 water bottle 0,010363991 0,000334784345222076 
2012-01-26 water bottle 0,011800716 0,000334784345222076 
2012-01-27 water bottle 0,012948411 0,000334784345222076 
2012-01-28 water bottle 0,012732459 0,000334784345222076 
2012-01-29 water bottle 0,011682568 0,000334784345222076 

每個數據庫系統似乎有不同的方法來轉換日期爲數字:

  • MySQL的:TO_SECONDS(date)TO_DAYS(date)
  • 甲骨文:TO_NUMBER(TO_CHAR(date, 'J'))date - TO_DATE('1','yyyy')
  • MS SQL服務器:CAST(date AS float)(或等值CONVERT
1

如果定義斜率剛剛從最早點到最新點的斜率,如果分數只與日增加,那麼你就可以得到上面這個輸出:

SELECT * 
    FROM scores 
    JOIN 
    (SELECT foo.keyword, 
      (MAX(score)-MIN(score))/DATEDIFF(MAX(date),MIN(date)) AS score 
    FROM scores 
    GROUP BY keyword) a 
    USING(keyword); 

Howeve如果你想要線性迴歸,或者如果分數可以隨着時間減少和增加,你需要更復雜的東西。

+0

分數也可以減少,我的意思是斜率最合適 – datayoda 2012-01-31 19:15:54

0

演員到小數點不給出正確的結果對我來說,它不是線性的日期。相反,使用TO_DAYS(date_field),這是正確的。