【问题标题】:MySQL Query to select last record for each of the past 7 daysMySQL 查询以选择过去 7 天中每一天的最后一条记录
【发布时间】:2012-02-14 13:30:05
【问题描述】:

我正在尝试提出一个 MySQL 查询来选择前 7 天中每一天的最后一条记录。如果前 7 天中有 1 天缺少数据,我只能取回 6 条记录。这是我所拥有的:

SELECT tracking.* FROM tracking
INNER JOIN 
    (SELECT MAX(lastChecked) AS maxLastChecked, id FROM tracking 
    WHERE lastChecked >= DATE_SUB(lastChecked, INTERVAL 7 DAY ) 
        GROUP BY DAY(lastChecked)) as Lookup ON Lookup.id = tracking.id
            WHERE tracking.propertyID = 1 ORDER BY tracking.lastChecked ASC LIMIT 7

基本上,这应该做的是在过去 7 天(从今天开始)的每一天(从今天开始)的跟踪表中选择 propertyID = 1 的最终记录条目。但是,此查询将其返回给我(超过过去 7 天内的仅记录):

ID    propertyID  lastChecked              value
2     1           2012-01-25 05:30:00      280
1     1           2012-01-26 12:34:02      268
5     1           2012-01-27 09:51:31      268
83    1           2012-02-13 00:01:07      276

任何解决此问题的帮助将不胜感激!

【问题讨论】:

  • Confirmation... 是“ID”列自动增量主键,2... 是 LastChecked 始终对应于它的添加时间,并且不能由 ID 83 或更早时间的人修改比 ID 84 或类似?另外,你在 lastchecked 列上有索引吗?

标签: mysql sql datetime select


【解决方案1】:

试试这个查询:

SELECT tracking.* FROM tracking
INNER JOIN 
    (SELECT MAX(lastChecked) AS maxLastChecked, id FROM tracking 
    WHERE DATEDIFF(lastChecked,NOW())<=7
        GROUP BY DAY(lastChecked)) as Lookup ON Lookup.id = tracking.id
            WHERE tracking.propertyID = 1 ORDER BY tracking.lastChecked ASC

【讨论】:

    【解决方案2】:

    我相信你应该在这部分有一个系统日期而不是“lastChecked”:

    DATE_SUB(lastChecked, INTERVAL 7 DAY )
    

    应该是:

    DATE_SUB(SYSDATE(), INTERVAL 7 DAY )
    

    【讨论】:

      【解决方案3】:
      WHERE lastChecked >= DATE_SUB(lastChecked, INTERVAL 7 DAY )
      

      你的代码中的这个条件对于每条记录都是正确的,因为 lastChecked 总是大于 lastChecked -7。 因此,如果您需要最近 7 天的数据,请将其替换为

      WHERE lastChecked >= DATE_SUB(SYSDATE(), INTERVAL 7 DAY )
      

      【讨论】:

        最近更新 更多