Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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,我有一个表格,每个项目都可以为每个国家设定一个月的不同预算。该表仅存储更改时的预算-因此,如果缺少一个月,这意味着预算保持不变。我试图用上个月的预算(在同一个国家/地区代码组中)填充缺少的值,以便可以查看每个月的项目国家/地区代码预算 我已经完成了我的查询,得到了两个如下所示的表(如果下面设置的表不太有效,我深表歉意-我通过许多查询和其他表的子查询得到了这些表)。注意:表b只是我用所有年份和月份构建的日历表。表g是我试图转换和填充值以获得最终输出表的表。也许甚至不需要表b 连接的最终输出应如下

我有一个表格,每个项目都可以为每个国家设定一个月的不同预算。该表仅存储更改时的预算-因此,如果缺少一个月,这意味着预算保持不变。我试图用上个月的预算(在同一个国家/地区代码组中)填充缺少的值,以便可以查看每个月的项目国家/地区代码预算

我已经完成了我的查询,得到了两个如下所示的表(如果下面设置的表不太有效,我深表歉意-我通过许多查询和其他表的子查询得到了这些表)。注意:表b只是我用所有年份和月份构建的日历表。表g是我试图转换和填充值以获得最终输出表的表。也许甚至不需要表b


连接的最终输出应如下所示:

 item_number  | country_code | budget | date_ym  
 1            | AU           | 100    | 201606  
 1            | AU           | 100    | 201607  
 1            | AU           | 100    | 201608  
 1            | AU           | NULL   | 201609
 1            | US           | NULL   | 201606
 1            | US           | 200    | 201607 
 1            | US           | 100    | 201608 
 1            | US           | 100    | 201609 
 1            | DE           | 50     | 201609
 2            | AU           | NULL   | 201608  
 2            | AU           | NULL   | 201609
 2            | DE           | 200    | 201606  
 2            | DE           | 200    | 201607  
 2            | DE           | NULL   | 201608 
 2            | DE           | NULL   | 201609 
select ic.item-number, ic.country_code, b.date_ym,
       (select g.budget
        from g
        where g.item_number = ic.item_number and
              g.country_code = ic.country_code and
              g.budget_set_date >= b.date_ym
        order by b.date_ym
        limit 1
       ) as budget
from (select distinct item_number, country_code from g) ic cross join
     b ;

我尝试了很多方法,但都没有得到正确的答案-将日历表交叉连接到我的表中,以获得所有值,其中b.date\u ym>=g.earlime\u budget\u set\u date,但这不起作用。还可以使用一个变量来捕获上一个预算集,并将其提前到下一行。

如果我理解正确,您可以使用
交叉连接来生成行,然后使用子查询来引入值

我有点不清楚日期比较的确切逻辑是什么,但想法是这样的:

 item_number  | country_code | budget | date_ym  
 1            | AU           | 100    | 201606  
 1            | AU           | 100    | 201607  
 1            | AU           | 100    | 201608  
 1            | AU           | NULL   | 201609
 1            | US           | NULL   | 201606
 1            | US           | 200    | 201607 
 1            | US           | 100    | 201608 
 1            | US           | 100    | 201609 
 1            | DE           | 50     | 201609
 2            | AU           | NULL   | 201608  
 2            | AU           | NULL   | 201609
 2            | DE           | 200    | 201606  
 2            | DE           | 200    | 201607  
 2            | DE           | NULL   | 201608 
 2            | DE           | NULL   | 201609 
select ic.item-number, ic.country_code, b.date_ym,
       (select g.budget
        from g
        where g.item_number = ic.item_number and
              g.country_code = ic.country_code and
              g.budget_set_date >= b.date_ym
        order by b.date_ym
        limit 1
       ) as budget
from (select distinct item_number, country_code from g) ic cross join
     b ;

太好了,谢谢-这帮我得到了正确的答案。我无法通过这种方式获得预算,因为按日期排序的订单没有得到最新日期(我有副本)。所以我给每个预算增加了一个等级:set[at]rank:=0;和([at]rank:=[at]rank+1)作为排名,然后按照您的建议纳入预算。