我有一个具有以下结构的表:
payments
- id
- created
- amount
- customer_id
此表包含以下值:
'2016-12-03', 100, 1,
'2016-12-10', 50, 2,
'2016-12-23', 130, 3,
'2017-01-03', 100, 1,
'2017-01-11', 25, 4,
'2017-01-12', 50, 2,
'2017-01-24', 10, 3,
'2017-01-24', 25, 4,
'2017-02-03', 100, 1,
'2017-02-03', 25, 4,
'2017-03-03', 100, 1
(我已将数据空间分隔以获得更好的视图,数月)
考虑到这些数据,我正在尝试构建一个MySQL查询,它会让我每月只付一次(也就是订阅)的客户,至少两个月,但上个月没有付款(截至今日截至2017-02-03,但MySQL中为(UTC_DATE() - INTERVAL 1 MONTH)
(自3月尚未结束)。
使用上面的数据,它会返回customer_id
2和3,但我不知道如何做到这一点。
请注意,我也是在按月推行(3月至今包括在内)
如果有所帮助,全球的想法是让那些已停止支付定期每月付款的客户。
我做了SQLFiddle来帮忙。
答案 0 :(得分:1)
好的,我将从一个部分答案开始......那些在前几个月至少每月付款一次的客户......
SELECT customer_id
FROM payments
WHERE created < DATE_FORMAT(NOW() ,'%Y-%m-01')
GROUP
BY customer_id
HAVING COUNT(DISTINCT DATE_FORMAT(created,'%Y-%m')) > 1;
...通过这个核心查询,我们可以将上个月的付款外部加入,如下所示......
SELECT a.*
FROM
( SELECT customer_id
FROM payments
WHERE created < DATE_FORMAT(NOW() ,'%Y-%m-01')
GROUP
BY customer_id
HAVING COUNT(DISTINCT DATE_FORMAT(created,'%Y-%m')) > 1
) a
LEFT
JOIN payments b
ON b.customer_id = a.customer_id
AND b.created BETWEEN DATE_FORMAT(NOW(),'%Y-%m-01') - INTERVAL 1 MONTH AND DATE_FORMAT(NOW(),'%Y-%m-01')
WHERE b.id IS NULL;
顺便说一句,复杂的日期比较是故意的。以这种方式编写它们允许MySQL在created
上使用索引(如果提供了一个索引)