【问题标题】:MySql Select - row subtract previous rowMySql Select - 行减去上一行
【发布时间】:2017-11-28 17:25:54
【问题描述】:

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

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(revenue)从updated_stats where product_name=a.product_name and income > a.revenue and product_name='Product1')

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

【问题讨论】:

    标签: mysql select subtraction cost-based-optimizer


    【解决方案1】:

    我会使用相关的子查询来做到这一点:

    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;
    

    注意:这将返回 NULL 而不是 0 表示 970。这实际上对我来说更有意义。但是你可以使用COALESCE()或者类似的函数把它变成0。

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

    【讨论】:

    • 嗨,戈登,谢谢你的回答,这是一个解决方案,我在最后添加了 where 子句来选择产品 1 这是我需要做的选择 u.*,(选择 u.revenue - u2.revenue from updated_stats u2 where u2.product_name = u.product_name and u2.updatedid updateid DESC
    • 这是一个很好的解决方案,可用于从他们的 Webhook 更新 Mollie 交易(例如退款)。由于 Mollie 实际上并没有给出每次交易的一次性退款金额,而是所有退款的总和。有了这个,您实际上可以看到您在交易中退还的每一笔金额。
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多