我想在MySQL中根据每个客户的最大时间戳选择过去三天的行,但我不确定如何执行此操作。
示例表:
id | timestamp | cust_ID
899900 | 2016-04-09 12:00:00 | 500219
899901 | 2016-04-12 16:00:00 | 500219
899902 | 2016-04-14 11:00:00 | 500219
899903 | 2016-04-15 12:00:00 | 500219
909901 | 2016-04-08 16:00:00 | 500230
909902 | 2016-04-14 11:00:00 | 500230
909903 | 2016-04-15 12:00:00 | 500230
939905 | 2016-05-02 19:00:00 | 500240
到目前为止,我有以下内容:
SELECT *
FROM table
WHERE timestamp BETWEEN max(timestamp) AND (max(timestamp) - INTERVAL 3 DAY)
GROUP BY cust_ID
但它给出了错误:
1111'无效使用群组功能'
答案 0 :(得分:1)
将表连接到自身的聚合,找到每个客户的最大时间戳:
SELECT t.*
FROM mytable t
JOIN (SELECT cust_ID, MAX(timestamp) max_timestamp -- each cust_ID's max timestamp
FROM mytable
GROUP BY cust_ID) m
ON timestamp BETWEEN max_timestamp - INTERVAL 3 DAY AND max_timestamp
AND t.cust_ID = m.cust_ID -- join on the specific cust_ID's max timestamp
另请注意,您必须在BETWEEN
中使用较小的表达式 first ,即
WHERE myColumn BETWEEN smaller AND larger
如果您反过来编码:
WHERE myColumn BETWEEN larger AND smaller -- don't do this
它仍然可以编译和执行,但是你不会得到任何返回的行。
答案 1 :(得分:0)
我希望能够理解你正在寻找什么,但是你可能需要具有聚合功能而不是
SELECT cust_id, max(timestamp)
from table
GROUP BY cust_ID
having max(timestamp) BETWEEN date_sub((max(timestamp) , INTERVAL 3 DAY) AND max(timestamp) ;