Mysql 按上次插入记录的时间间隔分组
我得到的数据集如下所示:Mysql 按上次插入记录的时间间隔分组,mysql,sql,Mysql,Sql,我得到的数据集如下所示: 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.. 我想按时间字段对其进行分组,并获得每个时间间隔的最大值(openBid),以及最后5个时间间隔(在本例中为5
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..
我想按时间字段对其进行分组,并获得每个时间间隔的最大值(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
我遇到的问题是,随着时间的推移,resultset中第一条记录的计数从1增加到5。在这个例子中,它是3。我希望我的查询在所有时间间隔内具有相同数量的记录。我认为问题在于小组赛准时开始于第一个记录。因为我在按DESC下单,所以我希望它从集合的最后一条记录开始。找到了解决方案,@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”的子查询还可以生成按主键排序的子集,从而对性能产生非常大的影响。找到了解决方案,@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
通过生成PK排序的子集,为“Ticker”使用子查询对性能也有很大的影响。如果我正确理解您的问题,我个人的做法是忘记使用时间戳(除了您现有的问题之外,由于服务停机等原因可能会丢失条目)并切换到连续的自动递增数字。如果你感到懒惰,一个自动递增的主键(如果你的服务器设置为以精确的1-MySQL集群跳跃的方式递增将打破这种方法)你可以按楼层分组(pk_column/5)按照我的方法,你可能必须提供一个偏移量来“更正”第一条记录。。。e、 g.
按楼层分组((主键栏+4)/5)
没想到,建议不错,谢谢!嗯,不幸的是,这仍然会带来同样的问题。它从记录1开始计数,而不是从最后一条记录开始计数。因此,对于最后插入的记录,我仍然有一个不完整的集合。您可能需要从1开始进行偏移以对其进行说明。5/5=1,所以在第一组中只能得到4(假设从1开始,除以5层到0)。如果我正确理解您的问题,请尝试将pk字段偏移+4(和/或共享您的方案和数据,如果您卡住了),我个人的方法是忘记使用时间戳(除了您现有的问题之外,可能会由于服务停机等原因丢失条目),并切换到连续的自动递增数字。如果你感到懒惰,一个自动递增的主键(如果你的服务器设置为以精确的1-MySQL集群跳跃的方式递增将打破这种方法)你可以按楼层分组(pk_column/5)按照我的方法,你可能必须提供一个偏移量来“更正”第一条记录。。。e、 g.按楼层分组((主键栏+4)/5)
没想到,建议不错,谢谢!嗯,不幸的是,这仍然会带来同样的问题。它从记录1开始计数,而不是从最后一条记录开始计数。因此,对于最后插入的记录,我仍然有一个不完整的集合。您可能需要从1开始进行偏移以对其进行说明。5/5=1,所以在第一组中只能得到4(假设从1开始,除以5层到0)。尝试将pk字段偏移+4(和/或共享您的方案和数据,如果您被卡住了)