【问题标题】:missing missing values in range mysql缺少范围 mysql 中的缺失值
【发布时间】:2015-11-05 10:20:48
【问题描述】:

我已经问过一个类似的问题,但我似乎仍然无法理解它。我的 sql 数据库中有一个 device_create_date 列

2015-07-14 12:35:19
2015-07-15 12:45:37
2015-07-15 12:45:37
2015-07-16 12:35:37
2015-08-14 10:35:21
2015-08-14 12:15:36

我以周为单位汇总这些日期值,但在周之间存在缺失值,我希望这些值恰好等于 0,以便我可以将它们与 Excel 工作表中的其他指标进行比较。我创建了一个虚拟表“日期”来连接这些值,以便选择在没有值的周返回 0。

这是我使用的查询,

select date.year, week(device.device_create_date), count(*)
from device 
join date
on date.week_of_year=week(device.device_create_date)
where device.id_customer = 1
group by device.year, date.WEEK_OF_YEAR
order by device.year, date.week_of_year;

这是我回来的,

2010    26  7252
2010    31  3108
2010    45  7203
2010    1   9324
2010    2   7252
2010    3   2072

这是我希望它还给我的东西;

2010 1  9324
2010 2  7252
2010 3  2072
2010 4  0
2010 5  0
2010 6  0 
etc

顺便说一句,这些值似乎也与数据库中的计数不匹配,所以我有点知道我做错了,但我对此并不擅长,因此我们将不胜感激任何帮助和指导。

提前谢谢你!!

【问题讨论】:

  • 我们需要device的结构..
  • 在这种情况下使用右连接,而不是内连接。另外,如果您有多年的数据,那么您需要在日期表中使用年和周并同时加入。

标签: mysql gaps-and-islands week-number


【解决方案1】:

由于您始终需要来自date 表的值(以获取所有可能的日期)和来自device 的匹配行,因此您需要使用date 作为源并使用left joindevice 表,因为 inner join 只会返回两个表中匹配的数据。

试试这个:

select date.year, date.week_of_year, count(device.device_create_date) 
from date
left join device on date.week_of_year = week(device.device_create_date) 
                and device.id_customer = 1
group by date.year, date.week_of_year
order by date.year, date.week_of_year;

如果您的表包含超过一年的数据,您应该将年份的条件添加到联接中,这样您就不会混合多年的数据。

【讨论】:

  • 效果很好,非常感谢 jpw 非常感谢,在您发表评论后,我也发现了错误,而不是 count(*),而是计算设备创建日期。我未满 15 岁,所以我不能对你的评论投赞成票,但它是完美的!
  • @NickKo 如果您在date 表中有未来几年的数据,您需要添加一个过滤器以仅获取您想要的年份:例如where date.year = 2015。您也应该将 and date.year = year(device.device_create_date) 添加到联接中。
  • 我读到回答的最后一条评论有点晚了哈,是的,现在一切正常,谢谢。 #thumbsup
猜你喜欢
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 2022-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 2015-06-13
  • 1970-01-01
相关资源
最近更新 更多