【问题标题】:Tracking LIFO Orders in SQL在 SQL 中跟踪 LIFO 订单
【发布时间】:2019-12-12 00:28:20
【问题描述】:

我正在尝试使用 LIFO 映射库存,以确定订单最初到达库存的日期到他们离开的日期。但是,库存可以从正变为负。

例如:

第 1 天:购买 1,000 个单位; (库存 1,000 件)

第 2 天:购买 1,000 个单位; (库存 2,000 件)

第 3 天:卖出 500 件; (库存 1,500 件)

第 4 天:购买 2,000 个单位; (库存 3,500 件)

第 5 天:卖出 3,000 台; (库存 500 件)

第 6 天:卖出 10,000 台; (库存 -9,500 件)

我需要知道第 5 天的单位来自第 1 天的最短日期和第 4 天的最长日期。在 SQL 中有没有办法做到这一点?

    UPDATE #TEMP_ORDERS_STEP_2
    SET CUMULATIVE_UNITS = UNITS
    , REMAINING_UNITS = UNITS
    , Min_Inventory_Date = 'n/a'
    , Max_Inventory_Date = 'n/a'
    WHERE Row_ID = 1
    AND CUMULATIVE_SHARES IS NULL
    --(30609 row(s) affected)

    SELECT DateId, OrderID, ProductCode, ProductType, Units, Row_ID, Inventory, CUMULATIVE_UNITS, Min_Inventory_Date, Max_Inventory_Date
    FROM #TEMP_ORDERS_STEP_2 A
    JOIN (SELECT * FROM #TEMP_ORDERS_STEP_2 WHERE REMAINING_UNITS IS NOT NULL) B
        ON A.ProductCode = B.ProductCode AND A.ProductType = B.ProductType AND A.Row_ID = B.Row_ID + 1  
    WHERE A.CUMULATIVE_SHARES IS NULL

【问题讨论】:

  • 出于好奇,您为此使用 RDBMS 而不是队列服务器是否有原因? (例如 MSMQ、RabbitMQ、Kafka 等)?
  • @Dai 这是一个常见的 RDBMS 实现,跟踪订单和库存。您可以在托管队列服务中实现相同事物的元素,但我怀疑此应用程序还有很多其他功能,这意味着在 RDBMS 中管理和跟踪此类数据非常合适。

标签: sql inventory lifo


【解决方案1】:

我猜你想要这样的东西

with hist as (select *
from (
values (1 , 1000 , 0),
(2 , 1000 , 0),
(3 , 0 , 500),
(4 , 2000 , 0),
(5 , 0 , 3000),
(6 , 0 , 10000)
) as V (day, buy, sell)),

stock as (
select day, 
sum(buy) over(partition by 0 order by day ROWS UNBOUNDED PRECEDING)
- sum(sell) over(partition by 0 order by day ROWS UNBOUNDED PRECEDING) as stock
from hist),

stock_with_max_min_days as (
select s.day, s.stock,
FIRST_VALUE(s2.day) over(partition by s.day order by s2.stock asc ROWS UNBOUNDED PRECEDING) min_previous_day,
FIRST_VALUE(s2.day) over(partition by s.day order by s2.stock desc ROWS UNBOUNDED PRECEDING) max_previous_day
from stock s
left outer join stock s2
on s.day > s2.day)

select day, stock, min_previous_day, max_previous_day
from stock_with_max_min_days
group by day, stock, min_previous_day, max_previous_day

你可以在这个小提琴中看到一个工作演示:

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=76c61fbd3bcc1a0c048587601ee2b1c0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    相关资源
    最近更新 更多