Mysql 选择特定时间段的烛台数据(最大、最小、打开、关闭)

Mysql 选择特定时间段的烛台数据(最大、最小、打开、关闭),mysql,sql,charts,Mysql,Sql,Charts,我正在研究烛台图表数据。我有一个数据库表(MySql)和 我试图为任何时间段(例如15分钟或每4小时、每6天等)选择一个最大值、最小值、打开值、关闭值 到目前为止我有 SELECT p.created, HOUR(`DATE`), MAX(p.value), MIN(p.value) FROM price GROUP BY DATE(`DATE`),HOUR(`DATE`) 没那么复杂。它为我提供了每小时的最大值和最小值,因此对于分钟和“完整”时段,如天、周、月,我可以使用月、日等功能 你

我正在研究烛台图表数据。我有一个数据库表(MySql)和

我试图为任何时间段(例如15分钟或每4小时、每6天等)选择一个最大值、最小值、打开值、关闭值

到目前为止我有

SELECT p.created, HOUR(`DATE`), MAX(p.value), MIN(p.value) 
FROM price 
GROUP BY DATE(`DATE`),HOUR(`DATE`)
没那么复杂。它为我提供了每小时的最大值和最小值,因此对于分钟和“完整”时段,如天、周、月,我可以使用月、日等功能


你知道如何为任何时间段(比如28分钟或31小时)构建查询吗?此外,这适用于最大值和最小值,但我还需要时间段的开始值(第一个)和结束值(最后一个)

若要对任意时间段进行分组,您可以获取所创建的
列的UNIX时间值(即自UNIX纪元以来的秒数),然后除以所需时间段的大小,只取结果商的整数部分(并丢弃余数)。因此,每28分钟分组一次:

SELECT   FROM_UNIXTIME(28*60 * (UNIX_TIMESTAMP(created) DIV (28*60))) grp_id
         MIN(value)    min_value,
         MAX(value)    max_value,
         MIN(created)  min_created,
         MAX(created)  max_created
FROM     price
GROUP BY grp_id
您会注意到,我还选择了
minu-created
max-created
,这两个值产生每组中第一个和最后一个值的时间。然后,您可以再次将结果连接回
price
表,以获得相关记录的
s(这本质上是“”问题的一个实例):


请参见。

要对任意时间段进行分组,您可以获取所创建的
列的UNIX时间值(即自UNIX纪元以来的秒数),然后除以所需时间段的大小,只取结果商的整数部分(并丢弃余数)。因此,每28分钟分组一次:

SELECT   FROM_UNIXTIME(28*60 * (UNIX_TIMESTAMP(created) DIV (28*60))) grp_id
         MIN(value)    min_value,
         MAX(value)    max_value,
         MIN(created)  min_created,
         MAX(created)  max_created
FROM     price
GROUP BY grp_id
您会注意到,我还选择了
minu-created
max-created
,这两个值产生每组中第一个和最后一个值的时间。然后,您可以再次将结果连接回
price
表,以获得相关记录的
s(这本质上是“”问题的一个实例):


请在上查看。

有关如何获取时间段的开始和结束值,请参阅。要获取特定时间段,请在开始时间和结束时间之间创建的位置使用
@Barmar-否,请不要在
之间使用
。特别是当时间戳的精度低于秒时,最好使用一个独占的上限(
@Jakub-我通常喜欢构造一个分组范围的临时/虚拟表(通常只是一个内联引用)。这对于日历表和数字表来说是最简单的,但其思想是得到类似
(groupId=1,start='2014-01-01 00:00:00.000',end=start+28分钟)
可以分组,通常也有助于命中索引。有关如何获取时间段的开始和结束值,请参阅。要获取特定的时间段,请使用
在开始时间和结束时间之间创建的位置
@Barmar-不,请不要在
之间使用
。特别是因为有带秒的时间戳在精确性方面,最好使用一个独占的上限(
@Jakub-我通常喜欢构造一个分组范围的临时/虚拟表(通常只是一个内联引用)。这对于日历表和数字表来说是最简单的,但想法是得到类似
(groupId=1,start='2014-01-01 00:00:00.000',end=start+28分钟)你可以接着分组,通常也有助于索引。WiCES:OUCH。没有索引,一年后回来。@ CcOnWork MuSE:取决于数据集的大小。如果需要,在索引列中,无论如何都要缓存Case>代码> GrpIId < /代码>。什么?嗯,不。假设组是稳定的,我倾向于考虑UNLI。kely(至少已经提到了两个)。我更愿意解决获取可接合、可索引标准的一般问题。@Clockwork Muse:我期待看到您提出的解决方案。如果表“price”包含2个或更多具有相同日期(已创建)的记录,则此SQL可能返回2个或更多具有相同“grp_id”的记录(因为连接):WuCES:OUCH。没有索引,返回,一年。@发条缪斯:取决于数据集的大小。如果需要的话,在索引列中,无论如何都要缓存Case>代码> GrpIID < /Cord>。什么?嗯,不。假设组是稳定的,我倾向于认为不太可能(至少已经提到了两个)。。我更愿意解决获取可连接、可索引标准的一般问题。@Clockwork Muse:我期待看到您提出的解决方案。如果表“price”包含2个或多个具有相同日期(已创建)的记录,则此SQL可能返回2个或多个具有相同“grp_id”的记录(因为连接)。
SELECT t.grp_id,
       t.min_value,
       t.max_value,
       price_min.value first_value,
       price_max.value last_value
FROM (
  SELECT   FROM_UNIXTIME(28*60 * (UNIX_TIMESTAMP(created) DIV (28*60))) grp_id
           MIN(value)    min_value,
           MAX(value)    max_value,
           MIN(created)  min_created,
           MAX(created)  max_created
  FROM     price
  GROUP BY grp_id
) t JOIN price price_min ON price_min.created = t.min_created
    JOIN price price_max ON price_max.created = t.max_created