【问题标题】: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演示