2014-05-24 22 views
1

如何計算mysql中每個前一行的百分比差異?mysql與上一行的百分比差異

我能得到這個工作,但如果我的date列不連續的,我不知道如何動態地把它:

SELECT c1.date, 
     c1.total, 
     ((c1.total - ifnull(c2.total, 0))/c1.total) AS percentage_change 
FROM table c1 
     LEFT OUTER JOIN table c2 
        ON c1.id = c2.id 
         AND c1.date - c2.date = 1 
ORDER BY c1.date DESC 
LIMIT 30 

這個麻煩的是,我的date列不一定c1.total - c2.total = 1

我的一個想法是做一個子查詢和select where c2.date < c1.date order by c2.date DESC LIMIT 1。我認爲會選擇下一個最低日期值,所以現在就試試。

+0

男孩哦,男孩,正在做這頓飯的人,不是嗎?!考慮提供適當的DDL(和/或一個sqlfiddle)與期望的結果集合 – Strawberry

回答

0

這裏是我的嘗試,不是100%肯定它是工作又和好奇,如果有一個更好的辦法,而無需使用3個表

SELECT c1.date, 
     c1.total, 
     ((c1.total - Ifnull((SELECT c3.date 
           FROM table c3 
           WHERE c3.date < c1.date 
           ORDER BY c3.date DESC 
           LIMIT 1), 0) 
         )/c1.total) AS percentage_change 
FROM table c1 
     LEFT OUTER JOIN table c2 
        ON c1.id = c2.id 
         AND c1.date - c2.date = 1 
ORDER BY c1.date DESC 
LIMIT 30 
2

這裏是你如何能做到這一點:

SELECT current.id, current.date, ((current.total - IFNULL(prev.total, 0))/current.total) AS percentage_change 
FROM 
(SELECT c1.id, c1.total, count(c2.*) as ordinal 
FROM some_table AS c1, some_table AS c2 
WHERE c2.date < c1.date) AS curr 

OUTER JOIN (SELECT c1.id, c1.total, count(c2.*) as ordinal 
FROM some_table AS c1, some_table AS c2 
WHERE c2.date < c1.date) AS prev 
    ON curr.ordinal - 1 = prev.ordinal; 

假設你沒有任何具有相同日期的行(並假設我的語法中沒有任何拼寫錯誤),這將起作用。不過,如果可以避免的話,我會建議您不要這樣做。

我首選的方案是使用這個(一種更有效的查詢):

SELECT * FROM some_table ORDER BY date ASC; 

然後做數學題,你的應用程序(不管它是什麼)之內,您在結果集進行迭代。

+0

謝謝!是的,我認爲在SQL之外進行計算會容易得多。感謝您的建議 –