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中的计数缺失值的主要内容,如果未能解决你的问题,请参考以下文章
如何从 MySQL 列中缺失的有序值中获取最小值? [复制]
如何使用 MYSQL 在最终表中包含所有列的默认值为 0 的缺失行?