【发布时间】:2017-09-20 08:59:03
【问题描述】:
我得到了一个如下所示的数据集:
localDateTime |bid
--------------------|--------
2017-09-17 15:35:05 |3085
2017-09-17 15:35:54 |3100
2017-09-17 15:37:05 |3100.2
2017-09-17 15:38:06 |3101.6
etc..
我想按时间字段对其进行分组,并获取每个时间间隔的 MAX(openBid) 并拥有最后 5 个间隔(在本例中为 5 分钟)。我使用这个查询:
SELECT
MIN(localDateTime) startTime
,MAX(bid) maxOpenBid
,COUNT(*) countRecords
FROM
Ticker
GROUP BY
UNIX_TIMESTAMP(localDateTime) DIV 300
ORDER BY ID DESC
LIMIT 5
这给出了以下结果:
startTime |maxOpenBid |countRecords
--------------------|-----------|------------
2017-09-20 10:50:03 |3306.9 |3
2017-09-20 10:45:03 |3305 |5
2017-09-20 10:40:04 |3304.9 |5
2017-09-20 10:35:04 |3306 |5
2017-09-20 10:30:03 |3303.2 |5
我遇到的问题是结果集中第一条记录的计数随着时间的推移从 1 增加到 5。在此示例中为 3。我希望我的查询在所有时间间隔内具有相同数量的记录。我认为问题在于 GROUP BY 准时从集合的第一条记录开始。由于我正在执行 ORDER BY DESC,因此我希望它从集合的最后一条记录开始。
【问题讨论】:
-
如果我正确理解您的问题 - 我个人的做法是忘记使用时间戳(除了您现有的问题,由于服务停机等原因可能会丢失条目)并切换到连续的自动递增数字。如果您感到懒惰,可以使用自动递增的主键(前提是您的服务器设置为精确地增加 1 - MySQL 集群会破坏这种方法),您可以这样做
GROUP BY FLOOR(pk_column / 5) -
按照我的方法,您可能必须提供一个偏移量来“纠正”第一条记录......例如
GROUP BY FLOOR((pk_column + 4) / 5) -
没想到,很好的建议,谢谢!
-
不幸的是,这仍然会产生同样的问题。它从记录 1 开始计数,而不是从最后一条记录开始计数。所以我最后插入的记录仍然不完整。
-
您可能需要从 1. 5/5 = 1 开始抵消它,因此您只会在第一组中获得 4 个(假设您从 1 开始...除以5 层到 0)。尝试将 pk 字段偏移 +4(和/或在遇到困难时分享您的方案和数据)