Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.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,我正在我的公司开发一个脚本,它将从我们的SCM中获取关于源代码活动的信息,例如给定产品随时间变化的行数。给定产品在同一天内发生的所有更改都合并到mySQL表中的一条记录中,如下所示: +------------+-------+------+ | date | prod | line | +------------+-------+------+ | 2011-11-25 | prod2 | 471 | | 2011-11-28 | prod2 | 389 | +-------

我正在我的公司开发一个脚本,它将从我们的SCM中获取关于源代码活动的信息,例如给定产品随时间变化的行数。给定产品在同一天内发生的所有更改都合并到mySQL表中的一条记录中,如下所示:

+------------+-------+------+
| date       | prod  | line |
+------------+-------+------+
| 2011-11-25 | prod2 |  471 |
| 2011-11-28 | prod2 |  389 |
+------------+-------+------+
然后,我使用内部联接和求和复制具有累积结果的表:

+------------+-------+------+
| date       | prod  | line |
+------------+-------+------+
| 2011-11-25 | prod2 |  471 |
| 2011-11-28 | prod2 |  860 |
+------------+-------+------+
现在,我想创建一个表,每个产品每天有一条记录。我已经能够通过加入日历表来做到这一点。但是,在创建新记录时,行字段应填充该产品的最新累积值,而不是某些硬编码的默认值,如NULL或0:

+------------+-------+------+
| date       | prod  | line |
+------------+-------+------+
| 2011-11-25 | prod2 |  471 |
| 2011-11-26 | prod2 |  471 |
| 2011-11-27 | prod2 |  471 |
| 2011-11-28 | prod2 |  860 |
+------------+-------+------+
到目前为止,我以两种不令人满意的方式解决了这个问题:

首先填写日期间隔,然后计算累计总和 循环最后一个表的每个元素,将最近的非空元素保存在@user变量中。 当我的桌子变得足够大时,第一个解决方案变得非常低效。第二个解决方案完成了任务,但我一直在试图找到一个更优雅的解决方案。以下是生成带有null的表的代码:

INSERT INTO final SELECT d.date,f.prod,p.line
FROM calendar AS d
CROSS JOIN
    (SELECT DISTINCT prod FROM cumulative) AS f
LEFT JOIN cumulative AS p USING (date,prod) ;

有什么想法吗?我正在使用MySQL。

似乎最明智的做法是每天存储一行,如果没有行更改,则为零。这将消除对日历表上的联接的需要

因此,您的源表不是这样的

+------------+-------+------+
| date       | prod  | line |
+------------+-------+------+
| 2011-11-25 | prod2 |  471 |
| 2011-11-28 | prod2 |  389 |
+------------+-------+------+
看起来是这样的

+------------+-------+------+
| date       | prod  | line |
+------------+-------+------+
| 2011-11-25 | prod2 |  471 |
| 2011-11-26 | prod2 |    0 |
| 2011-11-27 | prod2 |    0 |
| 2011-11-28 | prod2 |  389 |
+------------+-------+------+
至于运行sum本身,您的报表编写器可能比SQL更快地完成这项工作。如果MySQL支持窗口功能,您只需编写如下内容

select date, prod, 
       sum(line) over (partition by prod order by date)
from prod
尽管如此,您的报告编写者可能会更快

在不支持窗口函数的平台上,您只需要在子查询中求和

select p1.prod, p1.date, 
       (select sum(line) from prod 
        where prod = p1.prod and date <= p1.date) as num_lines
from prod p1
order by p1.prod, p1.date

为什么不创建一个,而是创建两个冗余表?