MySql Select - 行减去上一行

时间:2017-06-25 20:03:16

标签: mysql select subtraction cost-based-optimizer

我正在尝试从数据库中提取统计信息。 表的结构是:

UpdatedId product_name   revenue
980       Product1       1000
975       Product1       950
973       Product1       900
970       Product1       800
965       Product21      1200

因此收入=以前的收入+新的收入。

为了制作图表,我们的目标是像这样获得Product1的输出

UpdateId  Difference
980       50 
975       50 
973       100 
970       0 

我尝试了这个查询,但MySQL卡住了:)

选择a.product_name,a.revenue,b.revenue,b.revenue- a.revenue作为与updated_stats a,updated_stats b的区别,其中a.product_name = b.product_name和b.revenue =(选择min(收益))来自updated_stats,其中product_name = a.product_name,收入> a.revenue和product_name ='Product1')

你能告诉我,应该如何查询?感谢。

1 个答案:

答案 0 :(得分:2)

我会使用相关子查询来执行此操作:

select u.*,
       (select u.revenue - u2.revenue
        from updated_stats u2
        where u2.product_name = u.product_name and
              u2.updatedid < u.updatedid
        order by u2.updatedid desc
        limit 1
       ) as diff
from updated_stats u;

注意:对于970,这会返回NULL而不是0.这实际上对我来说更有意义。但您可以使用COALESCE()或类似函数将其变为0。

如果updated_stats的大小适中,您需要updated_status(product_name, updated_id, revenue)上的索引。该索引涵盖子查询。