mysql与前一行的百分比差异

mysql与前一行的百分比差异,mysql,sql,Mysql,Sql,如何计算mysql中前一行的百分比差异 我可以让它工作,但如果我的日期列不是连续的,我不知道如何动态地拉它: 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 =

如何计算mysql中前一行的百分比差异

我可以让它工作,但如果我的日期列不是连续的,我不知道如何动态地拉它:

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 
问题是我的日期列不一定是c1.total-c2.total=1


我刚才的一个想法是做一个子查询,选择c2.date这是我的尝试,我还不能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 

以下是您如何做到这一点:

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;

然后在迭代结果集的过程中,在应用程序内部进行数学运算。

天啊,人们用这一个做了一顿饭,不是吗?!考虑提供适当的DDL和/或SqLFIDLE连同期望的结果设置谢谢!是的,我认为在SQL之外进行计算会容易得多。谢谢你的建议
SELECT * FROM some_table ORDER BY date ASC;