【问题标题】:SQL to identify customers who order more than m times within k daysSQL识别k天内订购超过m次的客户
【发布时间】:2015-10-06 07:22:36
【问题描述】:

我在 MySQL 中有一个销售表如下:

CustomerID    OrderDate
101           2014-12-11
102           2014-12-13
101           2014-12-14
103           2014-12-15
...           ...

如果我想知道哪些客户在任何 10 天内订购了超过 5 次,或者更一般地,在任何 k 天内订购了 m 次,我应该怎么做?我尝试了自我加入,但在任何 k 天内都无法获得结果。

【问题讨论】:

  • 最近十天还是任意十天?
  • 你尝试了什么,哪里失败了?这不是一个“你能为我做我的工作吗”的网站。
  • 对不起。随便10天。我尝试自行加入销售表并计算销售日期,但无法获得所需的数据。
  • 为什么不提供有代表性的数据集和期望的结果?

标签: mysql


【解决方案1】:

你可以这样做:

SELECT customerID, OrderDate, COUNT(*) AS num, (SELECT OrderDate FROM table AS b WHERE b.OrderDate < t.OrderDate + INTERVAL 10 DAY ORDER BY OrderDate DESC LIMIT 1) AS EndDate
FROM table AS t
GROUP BY  customerID, EndDate
HAVING  OrderDate <= EndDate AND num >= 2

它将返回客户有超过 5 个订单的所有期间。请注意,如果同一客户在例如 2 个或更多期间有超过 5 个订单,您将拥有多个记录。如果您希望每个客户一行,只需使用 DISTINCT select 包装查询

【讨论】:

  • 这可能有效,但由于双子查询,它非常慢。我已经在 mysql 上使用我的数据库进行了尝试,即使等待了 20 分钟,我仍然无法获得结果。没有子查询有什么办法吗?
  • 仍然太慢,无法得到结果...想知道我是否可以在没有子查询的情况下解决...
  • 我尝试了一些没有子查询的不同方法,但都没有给我想要的结果:(你的表中有多少条记录?
  • 我已将MAX 函数替换为ORDER BY DESC LIMIT 1,所以试试它是否更快
  • 抱歉还是不行。可能表太大了。
【解决方案2】:

这样的东西有用吗?

select x.CustomerId from (
    select CustomerID, count(CustomerID) as customerCount from table where OrderDate > DATE_SUB(NOW(),INTERVAL 10 DAY)
) x
where x.customerCount > 5

我没有时间测试它,特别是日期减法部分,但这种事情过去对我有用。

【讨论】:

  • 对不起。我没有在我的原始帖子中指定。这是任何给定的 10 天,而不是从现在起的 10 天。
猜你喜欢
  • 2015-05-02
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
相关资源
最近更新 更多