2012-01-31 14 views
12

Mam niektóre dane w bazie danych sql i chciałbym obliczyć nachylenie. Dane ma ten układ:Jak obliczyć nachylenie w 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  

chciałbym ostateczną wyjście wyglądać tak przez utworzenie nowej tabeli za pomocą 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 

Aby komplikować, nie wszystkie słowa kluczowe mają 3 terminy warto danych, niektóre mają na przykład tylko 2.

Im prostszy SQL, tym lepiej, ponieważ moja baza danych jest prawnie zastrzeżona i nie jestem do końca pewien, jakie formuły są dostępne, chociaż wiem, że może to zrobić PONADTO (PARTYCJA PRZEZ), jeśli to pomaga. Dziękuję Ci!

UPDATE: określenia nachylenia najlepiej pasuje y = mx + p ps Excel byłoby = nachylenie()

Oto inny rzeczywisty przykład, że zwykle manipulowania w Excelu:

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

Spójrz na to pytanie na temat regresji liniowej w SQL. http://stackoverflow.com/questions/2536895/are-there-any-linear-regression-function-in-sql-server –

+2

@datayoda - Jak definiujesz nachylenie? Jeśli masz więcej niż dwa punkty danych, czy właśnie wybierasz nachylenie od najwcześniejszego punktu do ostatniego punktu? Czy próbujesz narysować linię najlepszego dopasowania pomiędzy wszystkimi punktami? Jeśli tak, to używając liniowych najmniejszych kwadratów lub jakiegoś innego algorytmu? Czy chcesz zmusić linię do trafienia w jeden z punktów (wiedząc, że zmniejszy to ogólną dobroć dopasowania)? –

+2

Istnieje kilka funkcji regresji liniowej w Oracle. http://docs.oracle.com/cd/B10501_01/server.920/a96540/functions101a.htm # 85925 –

Odpowiedz

12

Najczystsze jeden mogę zrobić:

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; 

Wykorzystuje Simple Linear Regression obliczyć nachylenie.

Wynik:

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 

Każdy system bazy danych wydaje się mieć inne podejście do konwersji dat na liczby:

  • MySQL:TO_SECONDS(date) lub TO_DAYS(date)
  • Oracle:TO_NUMBER(TO_CHAR(date, 'J')) lub date - TO_DATE('1','yyyy')
  • MS SQL Server:CAST(date AS float) (lub równoważny CONVERT)
1

Jeśli definiowania nachylenie stoku jak tylko od najwcześniejszego punktu do najnowszego punktu, a jeśli wynik zwiększa jedynie z datą, a następnie można uzyskać wyjście powyżej z tym:

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 r jeśli chcesz regresji liniowej, lub jeśli wyniki mogą się zmniejszać i zwiększać wraz z upływem czasu, potrzebujesz czegoś bardziej złożonego.

+0

wyniki również mogą się zmniejszyć i mam na myśli nachylenie najlepiej pasujące – datayoda

0

oddanych przecinku nie daje poprawne wyniki dla mnie to nie jest liniowa do dat. Zamiast tego staje się to poprawne.