【问题标题】:mysql select rows of past 3 days for each customermysql为每个客户选择过去3天的行
【发布时间】:2016-07-31 15:07:48
【问题描述】:

我想在 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 '无效使用组函数'

【问题讨论】:

  • 顺便说一句,在 sql 领域,2 不是“介于”3 和 1 之间。

标签: mysql greatest-n-per-group


【解决方案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

它仍然会编译和执行,但不会返回任何行。

【讨论】:

    【解决方案2】:

    我希望正确理解你在寻找什么,但可能是你需要聚合函数而不是哪里

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

    【讨论】:

    • 删除了错误的分号..无论如何
    • 没有。这在概念上是错误的。它行不通。您不能“拥有”时间戳。它不在 SELECT 中
    • 我的意思是“工作”,因为“不会抛出错误”
    猜你喜欢
    • 2014-08-07
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    相关资源
    最近更新 更多