我们有必要分析一个零件的消耗情况。我所拥有的数据是从我们的ERP系统中提取的。这样做的目的是在未来库存过多的地方找到“漏洞”。
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 … … …列说明:
我的想法是把数据分成几个部分。当股票出现正变化时,A节就开始了,就像到货订单一样,最后是股票的下一个正变化。第一节和最后一节是一个例外。第一节以今天的日期开始,以下一个积极的变化结束。最后一节以最后一个正变化开始,以最后一个数据行结束。
我希望基于上述数据的章节表如下所示。
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若要查找“孔”,应将计数列的结果汇总到下表。
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。
目前,我正在使用光标构造按摩数据,并得到我想要的。正如您可能想象的那样,这可能不是最好的方法。我想改进这个查询,我很期待能得到的任何提示。
谢谢!
发布于 2019-04-12 12:08:24
如果我正确理解,您可以使用聚合和窗口函数。关键是定义该节,该节似乎是B和+签名到每一行的累积计数:
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;https://stackoverflow.com/questions/55651205
复制相似问题