首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >零件进出量分析

零件进出量分析
EN

Stack Overflow用户
提问于 2019-04-12 12:02:39
回答 1查看 218关注 0票数 0

我们有必要分析一个零件的消耗情况。我所拥有的数据是从我们的ERP系统中提取的。这样做的目的是在未来库存过多的地方找到“漏洞”。

代码语言:javascript
复制
Part_number Sign Count Date
4711        B    100   12.04.2019
4711        -    2     16.04.2019
4711        -    1     18.04.2019
4711        -    3     01.05.2019
4711        -    5     14.05.2019
4711        -    1     18.05.2019
4711        +    25    23.05.2019
4711        -    7     24.05.2019
4711        -    1     01.06.2019
4711        -    1     14.06.2019
4711        -    6     15.06.2019
4711        +    15    23.07.2019
4711        -    7     24.07.2019
4711        -    3     01.08.2019
4711        -    25    14.08.2019
4711        -    6     15.08.2019
4712        B    10    12.04.2019
4712        -    2     13.04.2019
4712        -    3     14.04.2019
4713        …    …     …

列说明:

  • Part_number =>自我解释我猜
  • 符号
    • "B“当期股票
    • "-“用来建立秩序的部分,
    • "+“新零件订购和计划到货日期

  • 计数=>量
  • =>计划未来的日期

我的想法是把数据分成几个部分。当股票出现正变化时,A节就开始了,就像到货订单一样,最后是股票的下一个正变化。第一节和最后一节是一个例外。第一节以今天的日期开始,以下一个积极的变化结束。最后一节以最后一个正变化开始,以最后一个数据行结束。

我希望基于上述数据的章节表如下所示。

代码语言:javascript
复制
Part_number Section Date_start  Date_end
4711        1       12.04.2019  23.05.2019
4711        2       23.05.2019  23.07.2019
4711        3       23.07.2019  15.08.2019
4712        1       12.04.2019  14.04.2019

若要查找“孔”,应将计数列的结果汇总到下表。

代码语言:javascript
复制
Part_number Section Date_start  Date_end   Sum
4711        1       12.04.2019  23.05.2019 88   <= 100-2-1-3-5-1
4711        2       23.05.2019  23.07.2019 98   <= 88+25-7-1-1-6
4711        3       23.07.2019  15.08.2019 72   <= 98+15-7-3-25-6
4712        1       12.04.2019  14.04.2019 5    <= 10-2-3

我们的数据库服务器是2016。

目前,我正在使用光标构造按摩数据,并得到我想要的。正如您可能想象的那样,这可能不是最好的方法。我想改进这个查询,我很期待能得到的任何提示。

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-04-12 12:08:24

如果我正确理解,您可以使用聚合和窗口函数。关键是定义该节,该节似乎是B+签名到每一行的累积计数:

代码语言:javascript
复制
select part_number, section,
       min(date), max(date),
       sum(case when sign = '-' then -count else count end) as section_count,
       sum(sum(case when sign = '-' then -count else count end)) over (partition by part_number order by section) as sum
from (select t.*,
             sum(case when sign in ('B', '+') then 1 else 0 end) over (partition by part_number order by date) as section
      from t
     ) t
group by part_number, section;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55651205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档