mysql如何不使用窗口函数,去统计出入库情况
mysql如何不使用窗口函数,去统计出入库情况
你把这个表看做 进出库表,每个物料把时间正序后 依次累加数量 ,看这个物料的时间线上 是否会出现负数,1号进货5个 2号出库3个 3号你不能出库3个 最多俩个 不然就是负库存,说白 就是按时间线累加每天的数据 每个时间线不能出现 负数。需要用mysql 写出来 aa date num A 2024-01-03 2 B 2024-01-05 -2 。要求不能使用窗口函数。 CREATE TABLE your_table (material_code VARCHAR(10),invoice_date DATE,quantity INT
);INSERT INTO your_table (material_code, invoice_date, quantity)
VALUES('A', '2024-01-03', 2),('A', '2024-01-04', 4),('A', '2024-01-05', -2),('A', '2024-01-05', -5),('A', '2024-01-05', 5),('A', '2024-01-06', -9),('A', '2024-01-07', 5),('B', '2024-01-03', 2),('B', '2024-01-04', 4),('B', '2024-01-05', -2),('B', '2024-01-05', -5),('B', '2024-01-05', 5),('B', '2024-01-06', -9),('B', '2024-01-07', 5);
你要通过 MySQL 查询每个物料的库存变化,并检查在时间线上的库存是否会出现负数。在这个场景下,我们需要按照 invoice_date
进行累加库存,累加时一旦发现某一天的库存变为负数,就可以将其标记为库存不足。
这个查询需要以下步骤:
- 按照
material_code
和invoice_date
将数据按时间升序排列。 - 对于每个物料,逐步累加
quantity
,同时判断是否有任何时间点的库存是负数。 - 使用
变量
来累加数量并检查是否为负数,而不使用窗口函数。
MySQL 查询:
-- 定义变量
SET @current_stock = 0;
SET @prev_material = '';-- 查询每个物料的时间线库存变化,查看是否出现负数
SELECT material_code, invoice_date, quantity, @current_stock := CASE WHEN @prev_material = material_code THEN @current_stock + quantityELSE quantityEND AS stock_after_transaction,@prev_material := material_code AS material_code_check,CASE WHEN @current_stock < 0 THEN '库存不足'ELSE '库存充足'END AS stock_status
FROM your_table
ORDER BY material_code, invoice_date;
解释:
- @current_stock:一个变量,记录每个物料的当前累积库存。
- @prev_material:记录前一个物料的
material_code
,以确保如果物料切换,库存会重新计算。 - 累加逻辑:如果当前物料与上一个相同,累加库存。如果物料变了,重置库存累加。
- 库存检查:如果某个时间点的库存小于 0,会标记为
库存不足
。
执行结果示例:
material_code | invoice_date | quantity | stock_after_transaction | stock_status |
---|---|---|---|---|
A | 2024-01-03 | 2 | 2 | 库存充足 |
A | 2024-01-04 | 4 | 6 | 库存充足 |
A | 2024-01-05 | -2 | 4 | 库存充足 |
A | 2024-01-05 | -5 | -1 | 库存不足 |
A | 2024-01-05 | 5 | 4 | 库存充足 |
A | 2024-01-06 | -9 | -5 | 库存不足 |
A | 2024-01-07 | 5 | 0 | 库存充足 |
B | 2024-01-03 | 2 | 2 | 库存充足 |
B | 2024-01-04 | 4 | 6 | 库存充足 |
B | 2024-01-05 | -2 | 4 | 库存充足 |
B | 2024-01-05 | -5 | -1 | 库存不足 |
B | 2024-01-05 | 5 | 4 | 库存充足 |
B | 2024-01-06 | -9 | -5 | 库存不足 |
B | 2024-01-07 | 5 | 0 | 库存充足 |
说明:
stock_after_transaction
是每个时间点的库存。stock_status
表明库存是否充足,当库存低于 0 时显示 “库存不足”。
通过这个查询,你可以监控物料的库存变化,并及时发现负库存的情况。
============================================
=============================================================
【第二版:日期聚合】
好的,理解你的意思了。你希望在相同日期的 quantity
先进行聚合,然后再按日期累加库存变化。
我们可以在查询中加入一个聚合步骤,先对相同 material_code
和 invoice_date
的 quantity
进行汇总,之后再按照时间顺序进行库存的累加和检查。
更新的 MySQL 查询:
-- 定义变量
SET @current_stock = 0;
SET @prev_material = '';-- 先对相同日期的数量进行聚合,再按日期累加库存并检查是否为负
SELECT material_code, invoice_date, total_quantity, @current_stock := CASE WHEN @prev_material = material_code THEN @current_stock + total_quantityELSE total_quantityEND AS stock_after_transaction,@prev_material := material_code AS material_code_check,CASE WHEN @current_stock < 0 THEN '库存不足'ELSE '库存充足'END AS stock_status
FROM (-- 聚合相同日期的数量SELECT material_code, invoice_date, SUM(quantity) AS total_quantityFROM your_tableGROUP BY material_code, invoice_date
) AS aggregated_table
ORDER BY material_code, invoice_date;
解释:
-
内部子查询
aggregated_table
:- 通过
GROUP BY material_code, invoice_date
对相同物料、相同日期的数据进行聚合,使用SUM(quantity)
来计算每天的总数量。
- 通过
-
外部查询:
- 使用变量
@current_stock
来进行库存累加,逻辑与之前相同。如果物料切换,库存重新计算。 - 继续检查库存是否为负数,并根据结果显示 “库存不足” 或 “库存充足”。
- 使用变量
执行结果示例:
material_code | invoice_date | total_quantity | stock_after_transaction | stock_status |
---|---|---|---|---|
A | 2024-01-03 | 2 | 2 | 库存充足 |
A | 2024-01-04 | 4 | 6 | 库存充足 |
A | 2024-01-05 | -2 | 4 | 库存充足 |
A | 2024-01-06 | -9 | -5 | 库存不足 |
A | 2024-01-07 | 5 | 0 | 库存充足 |
B | 2024-01-03 | 2 | 2 | 库存充足 |
B | 2024-01-04 | 4 | 6 | 库存充足 |
B | 2024-01-05 | -2 | 4 | 库存充足 |
B | 2024-01-06 | -9 | -5 | 库存不足 |
B | 2024-01-07 | 5 | 0 | 库存充足 |
说明:
total_quantity
是经过日期聚合后的数量。- 之后的逻辑和之前一样,累加库存并检查是否为负。
这样,查询会先对同一天的数量进行汇总,然后再按照日期累加库存,确保你可以监控到任何可能出现负库存的情况。
相关文章:
mysql如何不使用窗口函数,去统计出入库情况
mysql如何不使用窗口函数,去统计出入库情况 你把这个表看做 进出库表,每个物料把时间正序后 依次累加数量 ,看这个物料的时间线上 是否会出现负数,1号进货5个 2号出库3个 3号你不能出库3个 最多俩个 不然就是负库存,…...

uni-app canvas文本自动换行
封装 支持单行文本超出换行。多行文本顺位排版 // 填充自动换行的文本function fillFeedText({ctx, text, x, y, maxWidth, lineHeight, color, size}) {// 文本配置ctx.setFontSize(size);ctx.setFillStyle(color);// 计算文本换行宽高,换行逻辑const words text…...

【设计模式-职责链】
定义 职责链模式是一种行为设计模式,**它通过将请求发送给链上的多个处理者来避免请求发送者与处理者之间的紧密耦合。每个处理者可以选择处理请求或将其传递给链中的下一个处理者。**这样,可以将处理请求的责任链式组织,从而实现更灵活的请…...
Prompt:在AI时代,提问比答案更有价值
你好,我是三桥君 随着AI技术的飞速发展,我们进入了一个信息爆炸的时代。在这个时代,只要你会提问,AI就能为你提供满意的答案。这种现象让很多人开始思考:在这个答案触手可及的时代,答案的价值是否还像以前…...
whatis命令:关于命令的简短描述
一、命令简介 whatis 命令用于查询命令、函数、文件等的基本用途,查询结果只是一句简短的描述。 例如 $ whatis ls ls (1) - list directory contents返回关于 ls 命令的简短描述。这个结果实质是来自于man手册的一个章节,在较新的L…...
ICM20948 DMP代码详解(54)
接前一篇文章:ICM20948 DMP代码详解(53) 上一回解析了inv_icm20948_compass_dmp_cal函数的大部分代码,本回继续讲解inv_icm20948_compass_dmp_cal函数的余下内容。为了便于理解和回顾,再次贴出inv_icm20948_compass_dmp_cal函数代码,在EMD-Core\sources\Invn\Devices\Dri…...

RabbitMQ的应用问题
一、幂等性保障 幂等性是数学和计算机科学中某些运算的性质, 它们可以被多次应⽤, ⽽不会改变初始应⽤的结果 数学上的幂等性: f(x)f(f(x)) |x| 数据库操作幂等性: 数据库的 select 操作. 不同时间两次查询的结果可能不同, 但是这个操作是符合幂等性…...
C++14:通过make_index_sequence实现将tuple转换为array
如何将vector转换为array呢 #include <iostream> #include <tuple> #include <array> using namespace std;template <typename V, typename... Types, size_t... I> constexpr auto do_tuple_to_array(tuple<V, Types...>&& tuple, in…...
Linux中修改MySQL密码
Linux中MySQL的密码操作 1、给用户设置/更新密码 mysqladmin -u用户名 -p原密码 password "新密码"该命令在终端直接执行,不需要进入mysql视图 该命令适用于以下情况: 用户的密码为空,为用户设置密码用户密码需要更新,…...
华为OD真题机试-英文输入法(Java)
华为OD机试真题中的“英文输入法”题目主要考察的是字符串处理、单词提取、以及基于前缀的单词联想功能。以下是对该题目的详细解析: 题目描述 主管期望你来实现英文输入法单词联想功能。具体需求如下: 依据用户输入的单词前缀,从已输入的…...

【React 】入门Day01 —— 从基础概念到实战应用
目录 一、React 概述 二、开发环境创建 三、JSX 基础 四、React 的事件绑定 五、React 组件基础使用 六、组件状态管理 - useState 七、组件的基础样式处理 快速入门 – React 中文文档 一、React 概述 React 是什么 由 Meta 公司开发,是用于构建 Web 和原生…...

2024年9月总结及随笔之丢卡
1. 回头看 日更坚持了639天。 读《软件开发安全之道:概率、设计与实施》更新完成读《软件设计的要素》开更并更新完成读《构建可扩展分布式系统:方法与实践》开更并更新完成读《数据湖仓》开更并持续更新 2023年至2024年9月底累计码字1555996字&#…...
sql语法学习 sql各种语法 sql增删改查 数据库各种操作 数据库指令
sql语法学习 sql各种语法 sql增删改查 数据库各种操作 数据库指令 学习SQL语法时,理解其基本结构和用法是关键。下面是SQL语法的详细学习指南,涵盖了SQL的主要部分,包括查询、插入、更新、删除、表操作等。 1. 基本查询语法 SQL 的查询语句…...
鸡兔同笼,但是线性代数
灵感来自:bilibili,巨佬! 我们有 14 14 14 个头, 32 32 32 只脚,所有鸡和兔都没有变异,头和脚都完整,没有数错。还有什么 Bug 吗 小学奥数 假设全是鸡,则有 14 2 28 14 \time…...
01---java面试八股文——springboot---10题
01-你是怎么理解Spring Boot 的约定优于配置 约定优于配置是一种软件设计的范式,它的核心思想是减少软件开发人员对于配置项的维护,从而让开发人员更加聚焦在业务逻辑上。Spring Boot 就是约定优于配置这一理念下的产物,它类似于 Spring 框架…...

计算机毕业设计 二手图书交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...

【进阶OpenCV】 (3)--SIFT特征提取
文章目录 sift特征提取一、基本原理二、特点三、代码实现1. 函数方法2. 检测图像中的关键点3. 绘制关键点4. 计算关键点描述符5. 输出特征坐标点 总结 sift特征提取 SIFT(Scale-Invariant Feature Transform,尺度不变特征变换)特征检测是一种…...

HarmonyOS/OpenHarmony Audio 实现音频录制及播放功能
关键词:audio、音频录制、音频播放、权限申请、文件管理 在app的开发过程中时常会遇见一些需要播放一段音频或进行语音录制的场景,那么本期将介绍如何利用鸿蒙 audio 模块实现音频写入和播放的功能。本次依赖的是 ohos.multimedia.audio 音频管理模块&am…...

css 中 ~ 符号、text-indent、ellipsis、ellipsis-2、text-overflow: ellipsis、::before的使用
1、~的使用直接看代码 <script setup> </script><template><div class"container"><p><a href"javascript:;">纪检委</a><a href"javascript:;">中介为</a><a href"javascript:…...

Activiti 工作流大致了解
一、什么是 Activiti 简而言之,就是系统的流程图,如:请假审批流程、账单审批流程等。 二、mysql与pom配置 mysql要使用jdbc:mysql://localhost:3306/activiti?autoReconnecttrue pom文件要添加关键依赖 <!--activiti核心依赖--> &…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...