【问题标题】:MySQL order blocks of 5 minutes intervalsMySQL 5 分钟间隔的订单块
【发布时间】:2019-12-25 15:35:41
【问题描述】:

这是我在数据库中的:

data                   table    status_ord
2019-08-20 15:30:12    tab1     1
2019-08-20 15:30:30    tab2     1
2019-08-20 15:31:31    tab2     2
2019-08-20 15:31:40    tab1     1
2019-08-20 15:31:55    tab1     1
2019-08-20 15:32:12    tab2     1
2019-08-20 15:32:35    tab2     1
2019-08-20 15:50:45    tab1     1
2019-08-20 15:55:52    tab2     1
2019-08-20 12:30:12    tab1     2
2019-08-20 12:35:35    tab2     2
2019-08-20 12:45:44    tab1     2

我需要首先按 status_ord 排序,我需要首先拥有所有状态为 1 的人,然后是状态为 2 的人。 然后我需要每隔 5 分钟按表排序,所有内容都必须按日期排序。

有这个输出:

data                   table    status_ord
2019-08-20 15:30:12    tab1     1
2019-08-20 15:31:40    tab1     1
2019-08-20 15:31:55    tab1     1
-- first 5 minutes block of tab 1
2019-08-20 15:30:30    tab2     1
2019-08-20 15:32:12    tab2     1
2019-08-20 15:32:35    tab2     1
-- first 5 minutes block of tab 2
2019-08-20 15:50:45    tab1     1
2019-08-20 15:55:52    tab2     1
2019-08-20 12:30:12    tab1     2
2019-08-20 12:35:35    tab2     2
2019-08-20 12:45:44    tab1     2
2019-08-20 15:31:31    tab2     2

我只知道如何对状态和日期的数据进行排序,如下所示:

SELECT *
FROM Ordine u
ORDER BY u.status_ord ASC, u.data

我希望我很清楚。谢谢!

【问题讨论】:

  • 定义“5 分钟”。
  • @Strawberry 例如,首先,从 15.30 到 15.35,我想先拥有所有的“tab1”,然后是所有的“tab2”

标签: mysql sql sorting datetime sql-order-by


【解决方案1】:

如果我理解正确,您可以使用整数运算将日期时间缩短为 5 分钟间隔:

SELECT *
     , UNIX_TIMESTAMP(`data`) div (5 * 60) * (5 * 60) AS ts
FROM t
ORDER BY `status_ord`, `ts`, `table`

Demo on db<>fiddle

【讨论】:

  • 看起来几乎完美,但在我的数据库上,第二个块不是按数据排序的(对我来说不是问题,只是问为什么)——无论如何,有一种方法可以从时间开始计算 5 分钟第一个“标签”?
  • @Mattek 您可以从每个时间戳中减去第一个时间戳,然后将结果除以 5x60 并乘以 5x60。至于排序,我只是尝试匹配输出,您可能需要按照子句的顺序重新排列列。
  • 对于“第一个选项卡”,我的意思是每个块的第一个,我如何计算每个选项卡的第一个,查询将是 SELECT * , SUM(UNIX_TIMESTAMP(data) - XXXX ) div (5 * 60) * (5 * 60) AS ts FROM t ORDER BY status_ord, ts, `table ?
【解决方案2】:
SELECT * FROM
             (SELECT `data`, `table`, status_ord, 1 AS **rowOrder**
              FROM Ordine
              WHERE `table` = 'tab1'
              ORDER BY status_ord ASC , data) AS tab1 
UNION 
             SELECT `data`, `table`, status_ord, 2 AS **rowOrder**
             FROM Ordine
             WHERE `table` = 'tab2'
             ORDER BY **rowOrder** , status_ord ASC , data

【讨论】:

  • 是的,我已经想到了这个解决方案,问题是我以前不知道我可以有多少个“标签”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2019-08-01
  • 2020-07-30
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
相关资源
最近更新 更多