我有一个看起来像这样的数据集:
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,我希望它从该集的最后一条记录开始。
答案 0 :(得分:0)
找到了解决方案,@ wally让我朝着正确的方向前进。
以下是我的工作:
SET @rownr =-1;
SELECT
MIN(localDateTime) startTime
,MAX(bid) maxOpenBid
,COUNT(*) countRecords
FROM
(
SELECT
(@rownr := (@rownr+1)) rownr
,ID
,localDateTime
,bid openBid
,ask openAsk
FROM
Ticker
ORDER BY ID DESC
LIMIT 25
) Ticker
GROUP BY
FLOOR(rownr/5)
ORDER BY ID DESC
LIMIT 5
使用“Ticker”子查询通过生成PK排序的子集对性能产生了很大的影响。