我是MySQL的新手。 我有一张如下的桌子。 它具有每天存储的不同SKU的库存水平。 我正在尝试编写一个查询,该查询输出在若干天内每天有多少SKU增加了库存和多少减少了库存水平。 我的主要问题是找出任何两个日期之间每日股票水平的差异,并将其分类为增加或减少。 表中不存储每日增减金额。 如有任何帮助/指导,将不胜感激。
表:
+------------+---------+-------+ | Date | SKU | Stock | +------------+---------+-------+ | 2020-03-23 | SKU1001 | 23149 | | 2020-03-23 | SKU1002 | 29218 | | 2020-03-23 | SKU1003 | 14827 | | 2020-03-23 | SKU1004 | 8852 | | 2020-03-23 | SKU1005 | 47362 | | 2020-03-23 | SKU1006 | 3572 | | 2020-03-23 | SKU1007 | 8744 | | 2020-03-23 | SKU1008 | 22788 | | 2020-03-23 | SKU1009 | 41897 | | 2020-03-23 | SKU1010 | 28245 | | 2020-03-22 | SKU1001 | 18326 | | 2020-03-22 | SKU1002 | 23123 | | 2020-03-22 | SKU1003 | 48501 | | 2020-03-22 | SKU1004 | 44070 | | 2020-03-22 | SKU1005 | 3160 | | 2020-03-22 | SKU1006 | 46216 | | 2020-03-22 | SKU1007 | 1620 | | 2020-03-22 | SKU1008 | 3314 | | 2020-03-22 | SKU1009 | 32254 | | 2020-03-22 | SKU1010 | 1442 | | 2020-03-19 | SKU1001 | 40992 | | 2020-03-19 | SKU1002 | 31477 | | 2020-03-19 | SKU1003 | 22976 | | 2020-03-19 | SKU1004 | 26858 | | 2020-03-19 | SKU1005 | 32397 | | 2020-03-19 | SKU1006 | 37801 | | 2020-03-19 | SKU1007 | 19530 | | 2020-03-19 | SKU1008 | 35202 | | 2020-03-19 | SKU1009 | 11723 | | 2020-03-19 | SKU1010 | 21201 | | 2020-03-18 | SKU1001 | 7449 | | 2020-03-18 | SKU1002 | 10404 | | 2020-03-18 | SKU1003 | 34944 | | 2020-03-18 | SKU1004 | 5696 | | 2020-03-18 | SKU1005 | 14732 | | 2020-03-18 | SKU1006 | 9916 | | 2020-03-18 | SKU1007 | 46623 | | 2020-03-18 | SKU1008 | 6755 | | 2020-03-18 | SKU1009 | 42848 | | 2020-03-18 | SKU1010 | 5209 | | 2020-03-17 | SKU1001 | 31777 | | 2020-03-17 | SKU1002 | 36504 | | 2020-03-17 | SKU1003 | 43737 | | 2020-03-17 | SKU1004 | 27706 | | 2020-03-17 | SKU1005 | 12099 | | 2020-03-17 | SKU1006 | 39922 | | 2020-03-17 | SKU1007 | 4897 | | 2020-03-17 | SKU1008 | 14773 | | 2020-03-17 | SKU1009 | 20108 | | 2020-03-17 | SKU1010 | 40094 | | 2020-03-16 | SKU1001 | 15459 | | 2020-03-16 | SKU1002 | 39511 | | 2020-03-16 | SKU1003 | 13586 | | 2020-03-16 | SKU1004 | 29648 | | 2020-03-16 | SKU1005 | 41381 | | 2020-03-16 | SKU1006 | 27868 | | 2020-03-16 | SKU1007 | 4220 | | 2020-03-16 | SKU1008 | 22182 | | 2020-03-16 | SKU1009 | 9079 | | 2020-03-16 | SKU1010 | 33130 | | 2020-03-15 | SKU1001 | 29597 | | 2020-03-15 | SKU1002 | 41033 | | 2020-03-15 | SKU1003 | 40937 | | 2020-03-15 | SKU1004 | 34551 | | 2020-03-15 | SKU1005 | 7283 | | 2020-03-15 | SKU1006 | 40625 | | 2020-03-15 | SKU1007 | 7935 | | 2020-03-15 | SKU1008 | 30623 | | 2020-03-15 | SKU1009 | 27591 | | 2020-03-15 | SKU1010 | 7633 | | 2020-03-12 | SKU1001 | 21712 | | 2020-03-12 | SKU1002 | 11933 | | 2020-03-12 | SKU1003 | 25913 | | 2020-03-12 | SKU1004 | 33388 | | 2020-03-12 | SKU1005 | 44811 | | 2020-03-12 | SKU1006 | 10177 | | 2020-03-12 | SKU1007 | 4748 | | 2020-03-12 | SKU1008 | 48676 | | 2020-03-12 | SKU1009 | 44767 | | 2020-03-12 | SKU1010 | 33986 | | 2020-03-11 | SKU1001 | 9156 | | 2020-03-11 | SKU1002 | 48079 | | 2020-03-11 | SKU1003 | 8815 | | 2020-03-11 | SKU1004 | 15756 | | 2020-03-11 | SKU1005 | 4446 | | 2020-03-11 | SKU1006 | 40009 | | 2020-03-11 | SKU1007 | 15591 | | 2020-03-11 | SKU1008 | 12904 | | 2020-03-11 | SKU1009 | 34635 | | 2020-03-11 | SKU1010 | 20042 | | 2020-03-10 | SKU1001 | 11811 | | 2020-03-10 | SKU1002 | 26257 | | 2020-03-10 | SKU1003 | 11387 | | 2020-03-10 | SKU1004 | 30888 | | 2020-03-10 | SKU1005 | 12192 | | 2020-03-10 | SKU1006 | 5236 | | 2020-03-10 | SKU1007 | 26115 | | 2020-03-10 | SKU1008 | 34821 | | 2020-03-10 | SKU1009 | 15294 | | 2020-03-10 | SKU1010 | 3344 | +------------+---------+-------+
所需输出:
Date Decrease Increase 2020-03-10 10 2020-03-11 6 4 2020-03-12 3 7 2020-03-15 4 6 2020-03-16 8 2 2020-03-17 4 6 2020-03-18 7 3 2020-03-19 3 7 2020-03-22 6 4 2020-03-23 3 7
WITH
cte1 AS ( SELECT DISTINCT `date`
FROM test ),
cte2 AS ( SELECT DISTINCT sku
FROM test ),
cte3 AS ( SELECT cte1.`date`,
cte2.sku,
COALESCE( stock,
FIRST_VALUE(stock) OVER (PARTITION BY cte2.sku
ORDER BY cte1.`date` DESC
ROWS BETWEEN 1 FOLLOWING AND 1 FOLLOWING),
0) stock
FROM cte1
CROSS JOIN cte2
LEFT JOIN test ON cte1.`date` = test.`date`
AND cte2.sku = test.sku ),
cte4 AS ( SELECT `date`,
sku,
stock,
COALESCE( LAG(stock) OVER (PARTITION BY sku
ORDER BY `date`),
0 ) lag_stock
FROM cte3)
SELECT `date`,
SUM(stock < lag_stock) Decrease,
SUM(stock > lag_stock) Increase
FROM cte4
GROUP BY `date`;
小提琴
如果某个date
的特定SKU
的行不存在,则使用最近的上一个日期的值。
如果缺少某个中间的date
值(如示例数据中的2020-03-20
和2020-03-21
),则输出中也缺少该日期。
假设每一个SKU每天都出现,您可以使用窗口函数(在MySQL8.0中可用)和聚合:
select
date,
sum(stock < lag_stock) decrease,
sum(stock > lag_stock) increase
from (
select t.*, lag(stock) over(partition by sku order by date) lag_stock
from mytable t
) t
group by date
我们可以使用一个附加条件来过滤掉存在间隙的SKU:
select
date,
sum(stock < lag_stock) decrease,
sum(stock > lag_stock) increase
from (
select
t.*,
lag(stock) over(partition by sku order by date) lag_stock,
lag(date) over(partition by sku order by date) lag_date
from mytable t
) t
where date = lag_date + interval 1 day
group by date
问题内容: 我有一个天气数据库,它大约每70秒获取一次数据集(取决于气象站何时发送数据)。 我想使用Pchart绘制图形,但是我有太多样本,所以X轴被拧紧了。 所以我想要大约每5分钟一次的数据。(或每30分钟) 我当前有的查询是这样的: 这样可以获取最近24小时的样本,但数量太多。 问题答案: 以下内容将为您提供一个示例,该示例包含时间戳记为:00,:05,:10 …的任何数据。 我正在使用取模函
问题内容: 范例: 在此表中,我需要获得Empid 1作为输出。因为它的bookid 8不止一次。 提前致谢.. 问题答案: 您可以使用: 但这会给您重复的内容。例如,如果您有1-8,1-8,1-9,1-9,则会得到1,1的输出,因为Empid 1具有两个不同bookid值的重复bookid。您将需要使用来过滤出重复的Empid。
问题内容: 我有一个包含以下两个表的数据库, USERS,POSTS 我正在寻找一种方法来获取用户拥有的帖子数。 我尝试了以下SQL命令的许多变体,但均未成功。与其显示单个用户的帖子数,不如显示一行包含所有帖子的数。 最后我想要这样的东西 问题答案: 弄清楚了。
主要内容:启动和设置慢查询日志,查看慢查询日志,删除慢查询日志慢查询日志用来记录在 MySQL 中执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率低,以便进行优化。 通俗的说,MySQL 慢查询日志是排查问题的 SQL 语句,以及检查当前 MySQL 性能的一个重要功能。如果不是调优需要,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。 默认情况下,慢查询日志功能是关闭的。可以通过以下命令查看是否开启慢查
问题内容: 我已将此代码用于提供+1分,但无法正常工作。 $ points变量现在是用户的点数。.我希望它加上一个点数。.例如,如果他有5个点数,它应该是5 + 1 =6。 但是没有,它只是改变了到1 我做错了什么?谢谢 问题答案: 您也可以这样做:
问题内容: 我不是从PHP运行命令! 我将MySQL log_error值设置为/var/log/mysql/error.log 但是,当我连接到数据库并运行SQL命令时,该错误不会出现在日志中。 有从某种Windows应用程序运行的命令。我只想知道什么无效命令发送给MySQL服务器,以便我尝试解决它们。 问题答案: 错误日志无法做到这一点:https : //dev.mysql.com/doc/
操作步骤: ①进入"业务动态"模块。 ②选择"动态发布记录",快速查看地图上动态的发布记录。 操作动图: [查看原图]
问题内容: 全部, 我敢肯定这是一个非常简单的SQL查询问题,但是我敢肯定有一个很好的方法,也很糟糕的方法来做到这一点。留给我自己的设备,我有可能以后者结束。所以… 我在Access中有一个表,其中的数据如下所示: 我想要获取的是每个具有唯一“截止日期”日期(采用YYYYMM格式)的唯一ID的“值”。 因此,我的结果集应如下所示: 请注意,不同的ID将具有不同的“截止日期”日期。换句话说,我不能简