让我们从我的表开始(针对我的问题进行了简化)(使用 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/