【问题标题】:Group by fixed interval range按固定间隔范围分组
【发布时间】:2018-11-20 11:53:13
【问题描述】:

我有时间以 unix 格式 int 存储。我想按 1 天即 86400 秒的间隔对结果进行分组。

样本数据

timestamp  | state
+++++++++++++++++++
1540427604 | ABC
1540770300 | PQR
1540770050 | PQR
1540751300 | ABC

我想按每个 86400 的周期对 state 的计数进行分组,即如果有人问从 1540425600(即 2018 年 10 月 25 日)到 1540771200(即 2018 年 10 月 29 日),那么输出应该是

range                    | state  | count
++++++++++++++++++++++++++++++++++++++++++
1540425600 - 1540512000  |   ABC  | 1
1540684800 - 1540771200  |   ABC  | 1
1540684800 - 1540771200  |   PQR  | 2

我已经尝试了很多东西,但我认为这个更接近..

select 
    concat(86400*floor(timestamp /86400), '-', 86400*floor(timestamp/86400) + 86400) as `range` , count(state)
    from MT 
    where timestamp between MINDATE AND MAXDATE
    group by `range` order by `range`;

但是我得到的输出不是以传递的 MINDATE 或 MINDATE 的倍数开头...但它在 86400 的范围内。我希望范围应始终以 mMINDATE 开头,如果这样的记录存在或以多个头脑 * 86400

请帮忙。

【问题讨论】:

    标签: mysql sql database group-by relational-database


    【解决方案1】:

    这里可以完成工作:

    select
    concat(min(floor(timestamp / 86400) * 86400), ' - ', max(floor(timestamp / 86400) * 86400) + 86400) as `range`
    , state
    , count(*)
    from t
    group by floor(timestamp / 86400), state
    order by `range`
    
    • sqlfiddle 中实时查看它的工作情况

    【讨论】:

    • 谢谢,但结果应该是...范围必须以用户提供的 MINDATE 或 MINDATE*86400 的倍数开头,目前,您的 statrs 的 min(timestamp) 不等于 MINDATE 也不在 MINDATE*86400 的倍数中
    • 查看我已经提供的示例所需输出。 :(
    • 编辑了我的答案。我想我现在已经知道了,但是您想要的结果有错误。 PQR 的最小范围值应为 1540771200,因为 1540770050 小于 1540770300。
    • 我已经在我的问题中修改了那个错误。谢谢大佬,现在可以了。 :)
    猜你喜欢
    • 2015-06-26
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多