【问题标题】:Grouping into interval of 30 minutes to its nearest hour分组到最近的小时的 30 分钟间隔
【发布时间】:2016-03-24 20:46:36
【问题描述】:

您好,我正在尝试将间隔按 30 分钟分组到最近的小时。我可以按 30 分钟分组,但我无法使最近时间的逻辑工作。我附上了一张快照,您可以从中了解我想要什么。

  select SUBSTRING_INDEX(GROUP_CONCAT(CAST(price AS CHAR) ORDER BY `timestamp`), ',', 1 ) as open,
                    max(price) high,
                    min(price) low,
                    SUBSTRING_INDEX(GROUP_CONCAT(CAST(price AS CHAR) ORDER BY `timestamp` desc), ',', 1 ) as close,
                    coinrace.watch_list.symbol,
                    timestamp
                    from coinrace.watch_quote
                    join coinrace.watch_list on coinrace.watch_list.watch_id = coinrace.watch_quote.watch_id
                    where (`timestamp` between '2015-12-03' and '2015-12-10')
                    and coinrace.watch_quote.serial_number = 1
                    and coinrace.watch_quote.BuyOrSell='buy'
                    and coinrace.watch_list.symbol='MCOEUR'
                    group by  UNIX_TIMESTAMP(timestamp) div (30*60)

【问题讨论】:

  • 2015-12-06 20:58:23 呢?应该是2015-12-06 21:00:00 还是2015-12-06 20:30:00
  • 2015-12-06 21:00:00 快到 21 点了
  • 不要将 BETWEEN 与日期/时间/时间戳值一起使用 - you'll sometimes get wrong results。您应该改用独占上限 (<)。您可能能够构造一个查询中的虚拟表进行分组。您不应包含不属于 GROUP BY 的非聚合列 - 您会得到不确定的结果。我不确定,但greatest-n-per-group 选项之一可能更适合open/close

标签: mysql sql mysql-workbench


【解决方案1】:

也许您不仅应该选择timestamp,还应该选择分组依据的值 (UNIX_TIMESTAMP(timestamp) div 1800),只有您还应该将其转换回可读的日期时间值:

from_unixtime((UNIX_TIMESTAMP(timestamp) div 1800)*1800)

所以查询应该是这样的:

  select SUBSTRING_INDEX(GROUP_CONCAT(CAST(price AS CHAR) ORDER BY `timestamp`), ',', 1 ) as open,
                    max(price) high,
                    min(price) low,
                    SUBSTRING_INDEX(GROUP_CONCAT(CAST(price AS CHAR) ORDER BY `timestamp` desc), ',', 1 ) as close,
                    coinrace.watch_list.symbol,
                    from_unixtime((UNIX_TIMESTAMP(timestamp) div 1800)*1800) as timestamp
                    from coinrace.watch_quote
                    join coinrace.watch_list on coinrace.watch_list.watch_id = coinrace.watch_quote.watch_id
                    where (`timestamp` between '2015-12-03' and '2015-12-10')
                    and coinrace.watch_quote.serial_number = 1
                    and coinrace.watch_quote.BuyOrSell='buy'
                    and coinrace.watch_list.symbol='MCOEUR'
                    group by  UNIX_TIMESTAMP(timestamp) div (30*60)

【讨论】:

  • 它也会相应地分组。它会从 7 点到 7:30 分组吗?
  • 我没有更改分组功能,因为它应该工作得很好,所以它应该与您之前的查询完全一样,只有时间戳列会有所不同。我没有安装 MySQL 来测试它。
猜你喜欢
  • 2014-10-09
  • 2020-03-03
  • 2021-07-16
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 2019-09-28
相关资源
最近更新 更多