mysql中的计数缺失值

Posted

技术标签:

【中文标题】mysql中的计数缺失值【英文标题】:Missing values on count in mysql 【发布时间】:2015-11-03 10:32:35 【问题描述】:

我只是被这个问题 atm 所困扰,我不能 100% 确定如何处理它。

我有一个表格,我在其中汇总每周的数据

 select week(create_date),count(*) 
from user 
where create_date > '2015-02-01'
and id_customer between 9 and 17
group by week(create_date);

我得到的结果在计数中有缺失值,如下所示

5   334
6   376
7   394
8   405
9   504
10  569
11  709
12  679
13  802
14  936
15  1081
16  559
21  1
24  9
25  22
26  1
32  3
34  1
35  1

例如,这里从 16 到 21 显然缺少 4 个值用于内部分析的 excel 文件。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

问题是sql查询不能真正产生根本不存在的数据。

您有 3 个选项:

    如果您的整个表中有您查询期间每周的数据,那么您可以使用自联接来获取缺失的周数:

    select week(t1.create_date), count(t2.id_customer) from customer t1 left join customer t2 on t1.id_customer=t2.id_customer and t1.create_date=t2.create_date and t2.id_customer between 9 and 17 where t1.create_date > '2015-02-01' group by week(t1.create_date)

    如果整个客户表中缺少周数,则创建一个辅助表,其中包含从 1 或 0(取决于 mysql 配置)到 53 的周数,并对这个辅助表进行左连接。

    使用存储过程循环遍历原始查询的结果,并使用临时表将缺失的数据插入结果集中,然后返回扩展数据集作为结果。

【讨论】:

我认为这是一个非常彻底的解释,非常直接,因为缺少一些值,我将继续创建你建议的辅助表,然后它应该有一个方向。再次感谢您,非常感谢。 如果第一天缺失,即第一周恰好是 5,那么从第一周开始的最佳解决方案是什么? 我不明白你的问题。第一天从哪里失踪?您想从哪里开始:第 1 周或第 5 周? 对不起,我会澄清我的问题。我希望选择语句从第一周开始返回,但某些数据集没有主要周数的记录。即选择语句向前返回记录 5。当我使用你的查询时,我得到的返回值不是从 1 开始,而是从 5 开始。我希望这足够清楚。再次感谢您的帮助。 然后添加一个过滤这些记录的条件。【参考方案2】:

问题是没有符合您的标准的缺失周数的数据。一个解决方案是从包含所有周数的表中加入。例如,如果您创建一个表 weeknumbers ,其中一个字段 weeknumber 包含从 0 到 53 的所有数字,您可以使用类似这样的内容

select weeknumber,count(user.*) 
from weeknumbers left join user on (weeknumbers.weeknumber=week(user.create_date) 
and user.create_date > '2015-02-01'
and user.id_customer between 9 and 17)
group by weeknumber;

此外,您可能希望限制不想看到的周数。 另一种方法是在应用程序中进行。

【讨论】:

非常感谢,通过案头研究我有点考虑这个选项,但我现在有了更好的方向。 #thumbsup

以上是关于mysql中的计数缺失值的主要内容,如果未能解决你的问题,请参考以下文章

如何按“熊猫”中的列获取缺失/NaN 数据的汇总计数?

MYSQL NULL值怎么处理?

如何从 MySQL 列中缺失的有序值中获取最小值? [复制]

如何使用 MYSQL 在最终表中包含所有列的默认值为 0 的缺失行?

na.fail.default 中的错误:对象中的缺失值 - 但没有缺失值

ARFF (Weka) 中的缺失值