我有两个桌子。
一个表包含客户数据,例如姓名和电子邮件地址。另一个表包含状态更改的日志。
状态日志表如下:
SQL server
以及客户数据:
+-------------+------------+------------+
| customer_id | status | date |
+-------------+------------+------------+
| 1 | Bought | 2018-07-01 |
| 1 | Bought | 2018-07-02 |
| 2 | Ongoing | 2018-07-03 |
| 3 | Ongoing | 2018-07-04 |
| 1 | Not Bought | 2018-07-05 |
| 4 | Bought | 2018-07-06 |
| 4 | Not Bought | 2018-07-07 |
| 4 | Bought | 2018-07-08 | *
| 3 | Cancelled | 2018-07-09 |
+-------------+------------+------------+
我想选择7月(07)“购买”的客户。但是,请排除状态从最近“购买”到其他任何事物的客户。
结果应该仅仅是一个客户(Philip)-其他所有客户的状态都发生了变化,而最近购买的商品除外。
我有以下SQL:
+-------------+------------+
| id | name | email |
+-------------+------------+
| 1 | Alex | alex@home |
| 2 | John | john@home |
| 3 | Simon | si@home |
| 4 | Philip | phil@home |
+-------------+------------+
但那是我所能做到的!上面的查询仅返回一个结果,但实际上可能有多个结果。
感谢您的帮助!
答案 0 :(得分:3)
这是一种使用相关子查询来获取最新状态记录的方法:
SELECT sl.customerid
FROM wwym_statuslog sl
WHERE sl.date = (SELECT MAX(sl2.date)
FROM wwym_statuslog sl2
WHERE sl2.customer_id = sl.customer_id AND
sl2.date >= '2018-07-01' AND
sl2.date < '2018-08-01'
) AND
sl.status = 'Bought'
ORDER BY sl.date DESC
LIMIT 1;
注意:
a
和b
之类的任意字母。LIKE
用于字符串。 MySQL有许多有效的日期函数。ROW_NUMBER()
。