MySQL如何显示日结果(表中的起始值、总变化和日结束值

MySQL如何显示日结果(表中的起始值、总变化和日结束值,mysql,aggregate,Mysql,Aggregate,我有这张桌子 在前面的步骤中,已确定记录编号,并计算了“PrevVal”和“NewVal”的值 记录的结束值(“NewVal”)将成为下一条记录的起始值(“PrevVal”) 我希望以每天只有一条记录的方式压缩表格,包括: 日期开始值“StartOfDay” 当天的总变化“总变化”,以及 结果的日终值“结束日期” 可以在演示表“ChangesPerDayCondensed中看到所需的结果 谁能帮我解决这个问题(存储过程可以)。 Thnx我有点困惑,因为记录的数字正朝着相反的方向发展。但无论如

我有这张桌子 在前面的步骤中,已确定记录编号,并计算了“PrevVal”和“NewVal”的值

记录的结束值(“NewVal”)将成为下一条记录的起始值(“PrevVal”)

我希望以每天只有一条记录的方式压缩表格,包括:

  • 日期开始值“StartOfDay
  • 当天的总变化“总变化”,以及
  • 结果的日终值“结束日期”
可以在演示表“ChangesPerDayCondensed中看到所需的结果

谁能帮我解决这个问题(存储过程可以)。
Thnx

我有点困惑,因为记录的数字正朝着相反的方向发展。但无论如何,你可以通过分别计算突变的起始值和总和,然后将它们全部相加得出终止值来解决这个问题。。 将结果降序排列,因为记录编号需要再次降低,以获得更高的日期

insert into ChangesPerDayCondensed 
select @recrd:=@recrd+1, a.MyDate, b.PrevVal, a.Mutation, b.PrevVal+a.Mutation 
from 
(select MyDate, sum(Mutation) as   Mutation from MutationsPerDay group by MyDate) a, 
(select b.MyDate, b.PrevVal from (select MyDate, max(RecNo) as RecNo from    MutationsPerDay group by MyDate) a, MutationsPerDay b where a.RecNo = b.RecNo) b,
(select @recrd:=0) c
where a.MyDate = b.MyDate order by MyDate desc;

我有点困惑,为什么记录的数字正好相反。但无论如何,你可以通过分别计算突变的起始值和总和,然后将它们全部相加得出终止值来解决这个问题。。 将结果降序排列,因为记录编号需要再次降低,以获得更高的日期

insert into ChangesPerDayCondensed 
select @recrd:=@recrd+1, a.MyDate, b.PrevVal, a.Mutation, b.PrevVal+a.Mutation 
from 
(select MyDate, sum(Mutation) as   Mutation from MutationsPerDay group by MyDate) a, 
(select b.MyDate, b.PrevVal from (select MyDate, max(RecNo) as RecNo from    MutationsPerDay group by MyDate) a, MutationsPerDay b where a.RecNo = b.RecNo) b,
(select @recrd:=0) c
where a.MyDate = b.MyDate order by MyDate desc;
我会这样做:

首先为每天创建一个查找(find First和lasts ReqNo),然后将两次连接到Daily表并计算更改:

SELECT first_.MyDate,
       first_.PrevVal AS StartOfDay,
       last_.NewVal AS EndOfDay,
       (last_.NewVal - first_.PrevVal) AS TotalChange
FROM
  (SELECT mpd1.MyDate,
          max(mpd1.RecNo) AS first_rec_no,
          min(mpd1.RecNo) AS last_rec_no
   FROM MutationsPerDay mpd1
   GROUP BY MyDate) AS lo
JOIN MutationsPerDay AS first_ ON lo.first_rec_no = first_.RecNo
JOIN MutationsPerDay AS last_ ON lo.last_rec_no = last_.RecNo
说明: 你真正想要的是: 对于每天第一个最后一个值(以及差异)。 因此,您首先需要为每个日期找到第一个和最后一个值的id:

SELECT mpd1.MyDate,
      max(mpd1.RecNo) AS first_rec_no,
      min(mpd1.RecNo) AS last_rec_no
FROM MutationsPerDay mpd1
GROUP BY MyDate

----------------------------------------------------
| MyDate              | first_rec_no | last_rec_no |
----------------------------------------------------
| 2016-12-05 00:00:00 | 16           | 13          |
| 2016-12-07 00:00:00 | 12           | 12          |
| 2016-12-12 00:00:00 | 11           | 8           |
| 2016-12-14 00:00:00 | 7            | 7           |
| 2016-12-20 00:00:00 | 6            | 6           |
| 2016-12-21 00:00:00 | 5            | 4           |
| 2016-12-28 00:00:00 | 3            | 3           |
| 2016-12-29 00:00:00 | 2            | 2           |
| 2016-12-30 00:00:00 | 1            | 1           |
----------------------------------------------------
然后,您可以使用这些firstlastid在源表中查找相应的值。例如,对于2016-12-21,您将获得id为first:5和last:4的行

5号PrevVal记录代表您在这一天看到的第一个值,4号记录中的NewVal代表您在这一天看到的最后一个值。如果减去它们,您将得到这一天的变化

我希望这能澄清一下方法论。

我会这样做:

首先为每天创建一个查找(find First和lasts ReqNo),然后将两次连接到Daily表并计算更改:

SELECT first_.MyDate,
       first_.PrevVal AS StartOfDay,
       last_.NewVal AS EndOfDay,
       (last_.NewVal - first_.PrevVal) AS TotalChange
FROM
  (SELECT mpd1.MyDate,
          max(mpd1.RecNo) AS first_rec_no,
          min(mpd1.RecNo) AS last_rec_no
   FROM MutationsPerDay mpd1
   GROUP BY MyDate) AS lo
JOIN MutationsPerDay AS first_ ON lo.first_rec_no = first_.RecNo
JOIN MutationsPerDay AS last_ ON lo.last_rec_no = last_.RecNo
说明: 你真正想要的是: 对于每天第一个最后一个值(以及差异)。 因此,您首先需要为每个日期找到第一个和最后一个值的id:

SELECT mpd1.MyDate,
      max(mpd1.RecNo) AS first_rec_no,
      min(mpd1.RecNo) AS last_rec_no
FROM MutationsPerDay mpd1
GROUP BY MyDate

----------------------------------------------------
| MyDate              | first_rec_no | last_rec_no |
----------------------------------------------------
| 2016-12-05 00:00:00 | 16           | 13          |
| 2016-12-07 00:00:00 | 12           | 12          |
| 2016-12-12 00:00:00 | 11           | 8           |
| 2016-12-14 00:00:00 | 7            | 7           |
| 2016-12-20 00:00:00 | 6            | 6           |
| 2016-12-21 00:00:00 | 5            | 4           |
| 2016-12-28 00:00:00 | 3            | 3           |
| 2016-12-29 00:00:00 | 2            | 2           |
| 2016-12-30 00:00:00 | 1            | 1           |
----------------------------------------------------
然后,您可以使用这些firstlastid在源表中查找相应的值。例如,对于2016-12-21,您将获得id为first:5和last:4的行

5号PrevVal记录代表您在这一天看到的第一个值,4号记录中的NewVal代表您在这一天看到的最后一个值。如果减去它们,您将得到这一天的变化


我希望这能澄清一点方法。

两个答案都能得出正确的结果!在这两种情况下,我都希望得到一些解释。我基本上理解这些解决方案,但我自己没有足够的经验来提出这样的解决方案。你能再澄清一点(以图形方式)吗非常感谢。记录编号“走向相反的方向”的原因是,插入的记录带有排序为desc.的日期,并且记录编号是一个自动编号字段(如果愿意,请使用PK)在插入时进行赋值。因此,PK值上升,日期值下降。两种答案都会产生正确的结果!在这两种情况下,我都想做一些解释。我基本上理解这些解决方案,但我自己没有足够的经验来产生这样的解决方案。请你再澄清一点(以图形方式)好吗非常感谢。记录编号“走向相反的方向”的原因是,插入的记录带有排序为desc.的日期,并且记录编号是一个自动编号字段(如果愿意,请使用PK)在插入时进行赋值。因此,PK值上升,日期值下降。两种答案都会产生正确的结果!在这两种情况下,我都想做一些解释。我基本上理解这些解决方案,但我自己没有足够的经验来产生这样的解决方案。请你再澄清一点(以图形方式)好吗非常感谢。我添加了一些解释,可惜没有图形化;)足够清楚。这两个答案都产生了正确的结果!在这两种情况下,我想有一些解释。我基本上理解这些解决方案,但是我自己没有足够的经验来产生这样的解决方案。请你再澄清一点(图形化的)好吗?非常感谢。我添加了一些解释,不幸的是没有图形化;)够清楚了,谢谢