Mysql 选择特定时间段的烛台数据(最大、最小、打开、关闭)
我正在研究烛台图表数据。我有一个数据库表(MySql)和 我试图为任何时间段(例如15分钟或每4小时、每6天等)选择一个最大值、最小值、打开值、关闭值 到目前为止我有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`) 没那么复杂。它为我提供了每小时的最大值和最小值,因此对于分钟和“完整”时段,如天、周、月,我可以使用月、日等功能 你
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