mysql为每个客户选择过去3天的行

时间:2016-07-31 15:07:49

标签: mysql greatest-n-per-group

我想在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'无效使用群组功能'

2 个答案:

答案 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)  ;