【问题标题】:SQL peak value per day每天的 SQL 峰值
【发布时间】:2017-07-05 22:13:18
【问题描述】:

我有一个下表:

   id |  booking_time       | art   | weight
   ---+---------------------+-------+------
    1 | 2017-06-18 10:34:09 | wood  |  1000
    2 | 2017-06-18 11:31:11 | wood  |  2000
    3 | 2017-06-18 14:11:25 | stone |  1000
    4 | 2017-06-18 16:47:37 | wood  |  -300
    5 | 2017-06-19 10:49:21 | wood  |   100
    6 | 2017-06-19 12:41:02 | wood  | -1000
    7 | 2017-06-19 12:49:54 | wood  |   200

我想要得到的是每天的库存峰值:

   booking_day |  art  | peak
   ------------+-------+-------
    2017-06-18 | wood  | 3000
    2017-06-16 | stone | 1000
    2017-06-19 | wood  | 2800

所以 18.06 的最高木材库存量为 3000 (1000 + 2000);一天结束时只剩下 2700 (1000 + 2000 - 300) 人

对于 19.06,我们从昨天的 2700 木材开始达到峰值 2800 (2700 + 100);一天结束时剩余的数量为 2000 (2700 + 100 - 1000 + 200)

甚至可以使用 SQL 吗?也许我需要另一个表来存储每日金额或类似的东西

【问题讨论】:

  • 是的,我想是的。见meta.stackoverflow.com/questions/333952/…
  • SO 的理念是您可以尝试一下,如果您有问题,我们会提供帮助。不是,您提供规范,我们为您编写
  • 欢迎来到 Stack Overflow。您可以考虑查看帮助部分以获取有关如何在 SO 上提出问题以获得有用结果的有用信息,以及适用于 SO 的问题类型。这对于 MySQL 来说是微不足道的。你试过什么?您想在示例中显示每天可用的网络还是结果?

标签: mysql sql


【解决方案1】:

你需要计算一个累计和然后聚合:

select date(booking_time), art, max(running_stock)
from (select t.*,
             (@s := if(@a = t.art, @s + weight,
                       if @a := t.art, weight, weight)
                      )
             ) as running_stock
      from t cross join
           (select @s := 0, @a := 0) params
      order by t.art, t.booking_time
     ) t
group by date(booking_time), art;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多