GROUP BY MONTH给出了错误的结果

时间:2018-05-31 05:05:43

标签: mysql sql

我正在尝试使用以下查询获取按月分组的唯一产品视图

SELECT
  Month(timestamp)           AS 'month',
  COUNT(DISTINCT visitor_id) AS 'unique'
FROM productviews pv INNER JOIN products p ON pv.product_id = p.id
WHERE p.vendor_id = 8 AND YEAR(timestamp) = 2018
GROUP BY month(timestamp);

我正在

+---------+--------+
| month   | unique |
+---------+--------+
|    1    |  3     |
+---------+--------+
|    2    |  10    |
+---------+--------+
|    3    |  2     |
+---------+--------+
|    4    |  4     |
+---------+--------+

但唯一产品视图的总数小于上一个查询的总和

SELECT count(DISTINCT pv.visitor_id)
FROM productviews pv INNER JOIN products p ON pv.product_id = p.id
WHERE p.vendor_id = 8 AND year(timestamp) = 2018

+---------+
|  count  |
+---------+
|    16   |
+---------+

这是逐月使用的正确方法吗?或者我会错过什么吗?

3 个答案:

答案 0 :(得分:7)

您的查询没问题。

因为访客可以访问超过一个月。

答案 1 :(得分:6)

如果访问者在2个月内查看了某个产品,那么第一个查询会将其计算两次,因为visitor_id在这两个月内将是唯一的。但是,第二个查询只计算一次这些视图,因为visitor_id在整个一年中都是重复的。

因此,任何一个查询的结果都没有错。

答案 2 :(得分:1)

很明显,如果算上没有日期的独特产品,你会得到16。 但是,如果按月计算不同的产品,则可以在不同月份使用相同的产品,因此最终的数字将不匹配。 如果你只计算(没有明显),最终的数字将是相同的 I.E.水果的数量分别为3,橙,苹果,香蕉。如果我按月计算不同的水果,我可以在1月份吃橘子和苹果,2月份吃橘子和香蕉,3月份吃橙子,苹果和香蕉......