【问题标题】:Grouping DATETIME by DATE in MySQL and showing the last record of the day在 MySQL 中按 DATE 分组 DATETIME 并显示当天的最后一条记录
【发布时间】:2014-02-16 05:48:56
【问题描述】:

我有一组每小时左右变化的货币报价。对于这个特定示例中的 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 (DATETIME)
  • 值(十进制)

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

【问题讨论】:

标签: mysql sql sql-date-functions sqldatetime


【解决方案1】:

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

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演示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多