Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 按上次插入记录的时间间隔分组_Mysql_Sql - Fatal编程技术网

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(和/或共享您的方案和数据,如果您被卡住了)