MySQL查找多个子集的众数

5

我有这样一个数据库:

custNum         date        purchase        dayOfWeek
  333         2001-01-01    23.23            1
  333         2001-03-04    34.56            5
  345         2008-02-02    22.55            3
  345         2008-04-05    12.35            6
  ...          ...           ...            ...

我正在尝试获取每个客户的dayOfWeek列的众数(最常出现的值)。基本上,这将是每个客户在哪一天购物最多的那一天。例如:

custNum         max(count(dayofweek(date)))
 333                   5
 345                   3
 356                   2
 388                   7
 ...                  ...

任何帮助都将是极好的,谢谢。

你如何识别一次购买 - 你的主键是什么?你有没有展示给我们一个 purchaseId 字段? - Branko Dimitrijevic
那么你的主键是什么?是{custNum,date}吗?如果是这样,那么你如何区分同一用户在同一天内进行的两次购买?你只是将它们加在同一行中吗? - Branko Dimitrijevic
每个客户每天只有一行记录,汇总了所有购买的内容,没有主键。 - screechOwl
当你说“每个客户每天有一行”时,你实际上是指“每个客户每个日期有一行”吗?如果是的话,这就是你的主键:{custNum,date}。最好在数据库中定义它,否则你可能会在同一日期为同一客户拥有两行数据,违反自己的规则。通常,没有主键是一个非常糟糕的做法。如果你也碰巧使用InnoDB,你将失去通过聚集进行优化的好机会。 - Branko Dimitrijevic
现在来到下一个问题:你为什么要尝试计算每周至少有一次购买的天数?难道你不应该统计purchase中的金额吗?这更符合大多数人所说的“客户购物最多”的概念。 - Branko Dimitrijevic
1个回答

3
select custNum, dayOfWeek
from tableName t
group by custNum, dayOfWeek
having dayOfWeek = (
    select dayOfWeek
    from tableName
    where custNum = t.custNum
    group by dayOfWeek
    order by count(*) desc, dayOfWeek
    limit 1
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接