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