1

我有一组每小时左右变化的货币报价。对于这个特定示例中的 sql 结果,我只需要 yyyy-mm-dd 格式的最近 30 天中每一天的最后一条可用记录。

这是我当前的查询:

SELECT value, DATE(date_quotation) as date_q
FROM quotation
GROUP BY DATE(date_quotation)
ORDER BY date_q DESC LIMIT 30

这用于直方图,其中 x 轴显示分隔的天数。报价表有以下几列:

  • id_quotation (INT)
  • date_quotation (日期时间)
  • 值(十进制)

问题是它不一定会带来当天的最后一条记录。它按天对记录进行分组,但它应该显示具有最高小时/分钟/秒的记录。有任何想法吗?谢谢!

4

1 回答 1

2

GROUP BY您可以利用 MySQL扩展的非标准行为并执行

SELECT DATE(date_quotation) date_q, value
  FROM
(
  SELECT value, date_quotation
    FROM quotation
   WHERE date_quotation >= CURDATE() - INTERVAL 30 DAY
     AND date_quotation <  CURDATE() + INTERVAL 1 DAY
   ORDER BY date_quotation DESC
) q
  GROUP BY DATE(date_quotation)

或者您可以通过选择每天的最大值date_quotation(假设没有重复)来按书进行操作,然后重新加入以quotation获取value

SELECT date_q, value
  FROM
(
  SELECT DATE(date_quotation) date_q, MAX(date_quotation) date_quotation
    FROM quotation
   WHERE date_quotation >= CURDATE() - INTERVAL 30 DAY
     AND date_quotation <  CURDATE() + INTERVAL 1 DAY
   GROUP BY DATE(date_quotation)
) t JOIN quotation q 
    ON t.date_quotation = q.date_quotation

注意: 这两个查询都使用索引友好的方式来过滤日期期间。确保您在date_quotation列上有索引。

这是SQLFiddle演示

于 2014-02-16T06:02:50.347 回答