Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何获得不同日期的单个最大值之间的差异?_Mysql_Sql - Fatal编程技术网

Mysql 如何获得不同日期的单个最大值之间的差异?

Mysql 如何获得不同日期的单个最大值之间的差异?,mysql,sql,Mysql,Sql,我是MySQL新手,我正在努力寻找: 给定一天的最大值与前一天的最大值之间的差值 我可以通过以下方式获得日期的最大值: select max(`bundle_count`), `Production_date` from `table` group by `Production_date` 但我不知道如何使用SQL计算两个给定日期的最大值之间的差异 我期待这样的结果 请帮助我。我不确定,但您需要这样的东西,希望它能在一定程度上对您有所帮助: 试试这个: SELECT t1.`Prod

我是MySQL新手,我正在努力寻找:

给定一天的最大值与前一天的最大值之间的差值

我可以通过以下方式获得日期的最大值:

select max(`bundle_count`), `Production_date` 
from `table` 
group by `Production_date` 
但我不知道如何使用SQL计算两个给定日期的最大值之间的差异

我期待这样的结果


请帮助我。

我不确定,但您需要这样的东西,希望它能在一定程度上对您有所帮助:

试试这个:

SELECT  t1.`Production_date` , 
         MAX(t1.`bundle_count`) - MAX(t2.`bundle_count`) ,  
         COUNT(t1.`bundle_count`)  
FROM `table_name` AS t1
    INNER  JOIN `table_name`  AS t2
   ON ABS(DATEDIFF(t1.`Production_date` , t2.`Production_date`)) = 1
GROUP BY t1.`Production_date`
编辑

我创建一个表名='table_name',如下所示

mysql> SELECT * FROM `table_name`;
+---------------------+--------------+
| Production_date     | bundle_count |
+---------------------+--------------+
| 2004-12-01 20:37:22 |            1 |
| 2004-12-01 20:37:22 |            2 |
| 2004-12-01 20:37:22 |            3 |
| 2004-12-02 20:37:22 |            2 |
| 2004-12-02 20:37:22 |            5 |
| 2004-12-02 20:37:22 |            7 |
| 2004-12-03 20:37:22 |            6 |
| 2004-12-03 20:37:22 |            7 |
| 2004-12-03 20:37:22 |            2 |
| 2004-12-04 20:37:22 |            1 |
| 2004-12-04 20:37:22 |            9 |
+---------------------+--------------+
11 rows in set (0.00 sec)
我的查询:要查找两个连续日期之间的
bundle\u count
差异:

 SELECT  t1.`Production_date` ,   
           MAX(t2.`bundle_count`) - MAX(t1.`bundle_count`) ,
           COUNT(t1.`bundle_count`)  
   FROM `table_name` AS t1     
     INNER  JOIN `table_name`  AS t2   
     ON ABS(DATEDIFF(t1.`Production_date` , t2.`Production_date`)) = 1
  GROUP BY t1.Production_date;
其产出:

+---------------------+-------------------------------------------------+--------------------------+
| Production_date     | MAX(t2.`bundle_count`) - MAX(t1.`bundle_count`) | COUNT(t1.`bundle_count`) |
+---------------------+-------------------------------------------------+--------------------------+
| 2004-12-01 20:37:22 |                                               4 |                        9 |
| 2004-12-02 20:37:22 |                                               0 |                       18 |
| 2004-12-03 20:37:22 |                                               2 |                       15 |
| 2004-12-04 20:37:22 |                                              -2 |                        6 |
+---------------------+-------------------------------------------------+--------------------------+
4 rows in set (0.00 sec)

更新1:这是我用来测试的小提琴。
更新2:这是一把小提琴,根据桑迪的评论,我用它来进一步精炼/修复。
更新3:由于某些原因,没有正确处理前一天的情况。我以为是的。不过,我已经进行了更新,以确保它能正常工作(有点麻烦——但它似乎是正确的。最后一把小提琴:


我认为@Grijesh从概念上通过输入数据的自连接为您提供了所需的主要内容(因此请确保您投票支持他的答案!)。我已经在语法上对他的查询进行了一些清理(以他的查询为基础!):


注1:我认为@Grijesh和我同时在清理查询语法问题。令人鼓舞的是,在我们都进行清理之后,我们最终得到了非常相似的版本。我的版本在使用
IFNULL()时有所不同
当没有前面的数据时。我还得到了一个
DATE\u SUB
,我确保通过
DATE()

注2:我最初并没有完全理解您的源表,所以我认为我需要在查询中实现一个运行计数。但经过更好的检查,很明显您的源数据已经有一个运行计数,所以我将该内容收回。

这是PostgreSQL语法(对不起,这是我熟悉的语法)但是基本上可以在任何一个数据库中运行。请注意,这也不能在PostgreSQL中运行,因为
group
不是一个有效的表名(它是一个保留关键字)。正如其他人所提到的,这种方法是自连接,但我使用了一个视图来处理每天的最大值以及作为单独步骤的差异

create view max_by_day as
select
  date_trunc('day', production_date) as production_date,
  max(bundle_count) as bundle_count
from
  group
group by
  date_trunc('day', production_date);

select
  today.production_date as production_date,
  today.bundle_count,
  today.bundle_count - coalesce(yesterday.bundle_count, 0)
from
  max_by_day as today
  left join max_by_day yesterday on (yesterday.production_date = today.production_date - '1 day'::interval)
order by
  production_date;
PostgreSQL还有一个名为的结构,它对这一点很有用,而且更容易理解。只是需要坚持一点,争取一个更好的数据库

select
  date_trunc('day', production_date),
  max(bundle_count),
  max(bundle_count) - lag(max(bundle_count), 1, 0)
over
  (order by date_trunc('day', production_date))
from
  group
group by
  date_trunc('day', production_date);

这两种方法在处理数据中缺失天数的方式上有所不同——第一种方法将其视为0,第二种方法将使用前一天的数据。您的样本中没有类似的情况,因此我不知道这是否是您关心的问题。

您的需要Join@Grijesh:我得到一个错误作为正确的语法来使用near'LeftJoin表名称t2 on datediff(t1.Production\u date-t2.Production\u date)==1@sandy改变了一点,现在我的系统上没有产生任何编译错误…感谢我的努力,这是第一次感谢我的回答不准确。这是帮助其他人的方法。@DWright:我面临一个问题,在输出第一天数据时没有出现,请访问此链接。我已经创建了一个表额外一列感谢Advanced出色的澄清。我已经更新了我的答案。另请参见fiddle答案中的更新2。@DWright我尝试了您提供的代码,但仍然得到相同的输出,缺少第一天的数据。因为第一天的问题是,它应该按原样打印数据,而不带检查条件,然后从下一天开始,它应该d检查前一天的情况。我正在尝试相应地更改代码。你能帮我吗桑迪,我已经更改了前一天的获取方式。希望这能为你做到。祝你好运!用上面更新的小提琴查看更新的答案。对不起,我一定是看错了问题,这个答案不对。不管怎样,还是留下它,因为有人可能会觉得窗户很有趣有意思。修正了-现在正确区分了当天和前一天,在我之前是所有前几天的最大值的累计总和。
select
  date_trunc('day', production_date),
  max(bundle_count),
  max(bundle_count) - lag(max(bundle_count), 1, 0)
over
  (order by date_trunc('day', production_date))
from
  group
group by
  date_trunc('day', production_date);