Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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 - Fatal编程技术网

Mysql 如何填补每周数据中的空白?

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

我有一个包含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 from DB -> null, '2013', '4' , '0'

4, '2013', '5' , '5'
5, '2013', '6' , '6'
6, '2013', '7' , '5'

这是一个有趣的!好了,开始吧。首先,我将给出一个简单的版本,它依赖于两个假设:

  • 您的表中每年至少有一个条目
  • 对于任何给定的年份,您的表中每周至少有一个。IE:此查询返回从1到52的所有数字:

    从您的_表中选择不同的一周

  • 考虑到这些约束条件,此查询应该满足您的要求:

    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将跳过已存在唯一年/周组合的任何行


    这个范围生成代码的答案令人赞叹:

    这是一个有趣的答案!好了,开始吧。首先,我将给出一个简单的版本,它依赖于两个假设:

  • 您的表中每年至少有一个条目
  • 对于任何给定的年份,您的表中每周至少有一个。IE:此查询返回从1到52的所有数字:

    从您的_表中选择不同的一周

  • 考虑到这些约束条件,此查询应该满足您的要求:

    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)