Oracle SQL,根据订单历史计算下一个订单数量

Oracle SQL, calculating next order qty based on order history

我正在使用以下脚本获取特定制造订单的订单历史记录;

select ds.status, ds.catnr, ds.part_no, ds.print_type, ds.nr_discs, ds.qty, ds.ship_date 
from
(select 'Open Order' status, gb.catnr, gb.part_no, decode(gb.tec_criteria,'XX','SCREEN','OF','OFFSET','PI','OFFSET','MC','OFFSET') print_type, sp.nrunits nr_discs, sum(gb.or_menge_fd) qty, min(trunc(gb.shd_date)) ship_date 
from gps_beweg gb, oes_customer oc, scm_packtyp sp
where gb.part_no = 'A0101628358-VV92-1900' 
and gb.uebergabe_oes = '1'
and gb.pwerk_disc = 'W'
and gb.cunr = oc.cunr
and gb.packtyp = sp.packtyp
group by gb.cunr, oc.name, gb.part_no, sp.nrunits, gb.tec_criteria, gb.catnr, gb.prodtyp, gb.packtyp
UNION ALL
select unique 'Shipped Order' status, 
null catnr, null part_no, null print_type, null nr_discs, 
(select sum(ds1.planqty) from oes_delsegview ds1 where ds.ordnr = ds1.ordnr and ds.catnr = ds1.catnr and ds.prodtyp = ds1.prodtyp and ds.packtyp = ds1.packtyp) qty,
(select trunc(max(ds1.gps_planshpdate)) from oes_delsegview ds1 where ds.ordnr = ds1.ordnr and ds.catnr = ds1.catnr and ds.prodtyp = ds1.prodtyp and ds.packtyp = ds1.packtyp) ship_date
from part_description pd1, oes_delsegview ds
where pd1.part_no =
    (select max(gb.part_no) 
        from gps_beweg gb
        where gb.part_no = 'A0101628358-VV92-1900' 
        and gb.uebergabe_oes = '1'
        and gb.pwerk_disc = 'W')
and pd1.catnr = ds.catnr
and pd1.prodtyp = ds.prodtyp
and pd1.packtyp = ds.packtyp
and ds.ord_o_status in ('7','9')
order by status, ship_date desc) ds
where rownum <=5

此脚本的结果如下所示...

我想使用 QTY 和 SHIP_DATE 列中的数据来预测下一个数量和日期。我可以使用 TREND 函数在 Excel 中执行此操作。在 SQL 中有没有办法做到这一点?它会符合 REGR_SLOPE 功能吗(我似乎无法理解它是如何工作的!?!)。

如前所述,据我所知,Oracle 的 SQL 没有内置趋势函数来帮助您。不过,您可以做的是尝试分析函数并提出一些算法。

例如,

ship_date - LAG(ship_date) OVER (ORDER BY ship_date) 为您提供上次订单和当前订单之间的天数。但是,您必须对这些值进行加权,例如将它们乘以 ROW_NUMBER() OVER (ORDER BY ship_date)。然后除以得到要添加到 MAX(ship_date).

的值

这是相应的查询。有点难以阅读和理解,但在我看来仍然是一个选择。该查询检索您的所有行以及每行的趋势日期和数量。因此,您可以看到某个时间会发生什么情况,以及实际发生了什么情况。最后一行为您提供当前预测。

select 
  status, catnr, part_no, print_type, nr_discs, qty, ship_date, 
  round(qty + sum(qty_diff_weighted) over (order by rn) /
    (sum(rn) over (order by rn) - 1)) as trend_qty,   
  round(ship_date + sum(date_diff_weighted) over (order by rn) /
    (sum(rn) over (order by rn) - 1)) as trend_date   
from
(
  select 
    status, catnr, part_no, print_type, nr_discs, qty, ship_date,
    row_number() over (order by ship_date) *
      (qty - lag(qty) over (order by ship_date)) as qty_diff_weighted,
    row_number() over (order by ship_date) *
      (ship_date - lag(ship_date) over (order by ship_date)) as date_diff_weighted,
    row_number() over (order by ship_date) as rn
  from (your query)
)
order by ship_date;

结果:

STATUS          CATNR   ...   QTY   SHIP_DATE    TREND_QTY   TREND_DATE
Shipped Order                 500   06.06.2014
Shipped Order                 500   17.11.2014   500         30.04.2015
Shipped Order                 300   21.09.2015   180         28.05.2016
Shipped Order                 300   16.08.2016   233         29.05.2017
Open Order      PPD168        300   24.03.2017   257         11.12.2017

这显示了技术。当然,你可能会想出更适合你的完全不同的算法。