Mysql 如何填补每周数据中的空白?
我有一个包含4个字段(id、年、周、总计)的表 我需要一个查询,我猜是使用join,根据year和week字段填充零值 在我的示例中,我需要填写2013年第3周和第4周的零值Mysql 如何填补每周数据中的空白?,mysql,Mysql,我有一个包含4个字段(id、年、周、总计)的表 我需要一个查询,我猜是使用join,根据year和week字段填充零值 在我的示例中,我需要填写2013年第3周和第4周的零值 Rec Id, Year, Week, Totals 1, '2012', '52', '23' 2, '2013', '1' , '9' 3, '2013', '2' , '4' Missing record from DB -> null, '2013', '3' , '0' Missing record fr
Rec Id, Year, Week, Totals
1, '2012', '52', '23'
2, '2013', '1' , '9'
3, '2013', '2' , '4'
Missing record from DB -> null, '2013', '3' , '0'
Missing record from DB -> null, '2013', '4' , '0'
4, '2013', '5' , '5'
5, '2013', '6' , '6'
6, '2013', '7' , '5'
这是一个有趣的!好了,开始吧。首先,我将给出一个简单的版本,它依赖于两个假设:
INSERT INTO your_table (id, year, week, totals)
SELECT null, y, w, 0 FROM (
SELECT DISTINCT week w FROM your_table
) weeks
CROSS JOIN
(
SELECT DISTINCT year y FROM your_table
) years
WHERE
(y > (select min(year) from your_table) OR w > (select min(week) from your_table where `year`=y))
AND
(y < (select max(year) from your_table) OR w < (select max(week) from your_table where `year`=y))
AND
NOT EXISTS (select year, week from your_table where `year`=y AND `week`=w)
与
如果您愿意,您可以在完成后将其删除,如下所示:
ALTER TABLE `your_table` DROP INDEX date;
在这种情况下,可以删除where条款的最后一部分:
AND
NOT EXISTS (select year, week from your_table where `year`=y AND `week`=w)
因为INSERT IGNORE将跳过已存在唯一年/周组合的任何行
这个范围生成代码的答案令人赞叹:这是一个有趣的答案!好了,开始吧。首先,我将给出一个简单的版本,它依赖于两个假设:
INSERT INTO your_table (id, year, week, totals)
SELECT null, y, w, 0 FROM (
SELECT DISTINCT week w FROM your_table
) weeks
CROSS JOIN
(
SELECT DISTINCT year y FROM your_table
) years
WHERE
(y > (select min(year) from your_table) OR w > (select min(week) from your_table where `year`=y))
AND
(y < (select max(year) from your_table) OR w < (select max(week) from your_table where `year`=y))
AND
NOT EXISTS (select year, week from your_table where `year`=y AND `week`=w)
与
如果您愿意,您可以在完成后将其删除,如下所示:
ALTER TABLE `your_table` DROP INDEX date;
在这种情况下,可以删除where条款的最后一部分:
AND
NOT EXISTS (select year, week from your_table where `year`=y AND `week`=w)
因为INSERT IGNORE将跳过已存在唯一年/周组合的任何行
这个范围生成代码的答案值得称赞:顺便说一句,为了帮助人们给你mysql问题提供好的答案,在你的问题中加入真正生成示例的代码是很有用的。IE:创建表格并插入表格。这样他们就可以测试自己的回答,而不必手动复制你的示例。你说得太对了!对不起,没关系。我只是想让你知道下一次。顺便说一句,为了帮助人们对mysql的问题给出好的答案,在你的问题中加入代码是很有用的,它将实际生成示例。IE:创建表格并插入表格。这样他们就可以测试自己的回答,而不必手动复制你的示例。你说得太对了!对不起,没关系。只是想让你知道下一次。当然,你可以用多种方式生成1-52的范围。我认为这是最酷的一个,但是你也可以使用一个简单的循环,或者其他一些技巧,正如我链接到的那个问题的其他答案所给出的;我对你的回答印象深刻!非常感谢你的帮助!当然,可以通过多种方式生成1-52的范围。我认为这是最酷的一个,但是你也可以使用一个简单的循环,或者其他一些技巧,正如我链接到的那个问题的其他答案所给出的;我对你的回答印象深刻!非常感谢你的帮助!
AND
NOT EXISTS (select year, week from your_table where `year`=y AND `week`=w)