mysql - 计算有多少客户在第一次、第二次……订单后不到一个月内下订单

标签 mysql database

让我们从我的表开始(针对我的问题进行了简化)(使用 MySQL):

client :
+----------+----------------------+
| idClient |    insctiptionDate   |
+----------+----------------------+
|     1    | 2017-07-31 14:51:22  |
+----------+----------------------+
|     2    | 2017-07-18 08:25:36  |
+----------+----------------------+

delivery :
+----------+----------------------+
| fkClient |         date         |
+----------+----------------------+
|     1    | 2017-07-31 14:51:22  |
+----------+----------------------+
|     1    | 2017-08-10 13:30:22  |
+----------+----------------------+
|     2    | 2017-07-18 08:25:36  |
+----------+----------------------+

inscriptionDate 列等于每个客户首次交付的日期。

我需要知道有多少客户在第一次下订单后的 28 天内再次订购。

到目前为止,我有这个:

SELECT
  YEARWEEK(tmp.first) AS Week,
  COUNT(tmp.id) AS Total  
FROM (
  SELECT
    c.idClient as id,
    (SELECT
        MIN(d.date)
     FROM delivery d
     WHERE c.idClient = d.fkClient 
    ) AS first
  FROM client c
  ORDER BY first ASC
  ) AS tmp
WHERE (
  SELECT
    MIN(d.date)
  FROM delivery d
  WHERE tmp.id = d.fkClient
  AND d.date != tmp.first
  AND DATEDIFF(d.date, tmp.first) <= 28
  ) IS NOT NULL
 GROUP BY YEARWEEK(first)
 ORDER BY YEARWEEK(first);

我首先为所有客户收到第一次送货,然后我计算在接下来的 28 天内有多少人第二次订购。

我的问题是:

  • 我不确定这是最优雅的解决方案,或者即使这确实有效,所以我愿意接受这里的任何建议
  • 我仅限于一个 SELECT 来执行此操作(我正在使用 SQL 模式 Chartio 来可视化结果)
  • 我需要扩展此范围,以了解有多少客户在他们的 第二次交付,第三次……我真的被困在这里了!

感谢您的帮助!

最佳答案

我无法测试它,但我认为你应该这样做:

SELECT IdClient, SUM(NumberCommand)
FROM
(   SELECT
        SUM(
            CASE 
                WHEN 
                    @previousId = d.fkClient
                    THEN
                    CASE
                        WHEN @prevDate <>d.date
                            AND DATEDIFF(d.date,@prevDate)<=28
                        THEN 1 
                        ELSE 0
                    END
                ELSE
                    1
        ) AS NumberCommand,

        (@previousId := d.fkClient) as IdClient,
        (@prevDate := d.date) as DateDelivery
    FROM 
    delivery d,
    INNER JOIN (SELECT @prevDate := inscriptionDate, idClient FROM client) b
        ON b.idClient = d.fkClient
    CROSS JOIN (SELECT @previousId:=0) a
    GROUP BY IdClient, DateDelivery
    ORDER BY IdClient, d.date) C 
GROUP BY IdClient

关于mysql - 计算有多少客户在第一次、第二次……订单后不到一个月内下订单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47306781/

相关文章:

java - 如何指定 hibernate 连接映射?

php将带有动态列的mysql数据导出到csv

php - 需要帮助修复 PHP Ajax Jquery Sql 动态下拉列表

mysql - 对 300 万个数据点进行大量计算并制作图表的解决方案

C# - 无法从数据库获取值

sql - 如何将数据库备份到 .bak 文件?

php - while 循环和 php-mailer

java - 如何检查java编译查询中的小于条件?

sql - 如何使用一张数据库表计算一段时间内的差异?

database - 是否有可能获得在 postgres 中进行的查询的历史记录