首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL -确定行中的前一个值

MYSQL -确定行中的前一个值
EN

Stack Overflow用户
提问于 2014-03-29 01:46:46
回答 1查看 62关注 0票数 0

我希望在将时间戳分组为3分钟组后,在一行中确定前两个值;例如,使用下表

代码语言:javascript
复制
Timestamp             Total
2013-10-11 00:01:00     1
2013-10-11 00:02:00     5
2013-10-11 00:03:00     6
2013-10-11 00:04:00     3
2013-10-11 00:05:00     9
2013-10-11 00:06:00     10
2013-10-11 00:07:00     12
2013-10-11 00:08:00     10
2013-10-11 00:09:00     15
2013-10-11 00:10:00     12

       .                .
       .                .

我必须将时间戳分组为3分钟组并显示每个3分钟组的最大值的代码是

代码语言:javascript
复制
SELECT 
    max (Timestamp)
     AS tstamp
     max(total)
FROM table
Group by ROUND(UNIX_TimeStamp(timestamp)/180)

给出的输出是

代码语言:javascript
复制
 tstamp               max( Total)
2013-10-11 00:01:00       1
2013-10-11 00:04:00       6
2013-10-11 00:07:00       12
2013-10-11 00:10:00       15

       .                

我希望在每个3分钟组中添加前两个值,如果最大值被找到,所以我得到

代码语言:javascript
复制
tstamp               max( Total) Previous1  Previous2
2013-10-11 00:01:00       1          0         0
2013-10-11 00:04:00       6          5         1
2013-10-11 00:07:00       12         10        9
2013-10-11 00:10:00       15         10        12

       .                

我认为一种方法是在嵌套的选择中使用最大(时间戳)间隔1分钟,然后使用最大(时间戳) -INTERVAL 2分钟。一些类似的东西,但我不完全确定

是否有一种更简单、更干净的方法来解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-29 02:28:29

所以我从你所拥有的开始:

代码语言:javascript
复制
select 
max(`Timestamp`) AS 'Timestamp'
,max(total) as total
, ROUND(UNIX_TimeStamp(`Timestamp`)/180) as roundBy3
FROM `time`
Group by ROUND(UNIX_TimeStamp(`Timestamp`)/180)
) summary

然后我添加了一些更多的细节:

代码语言:javascript
复制
select `Timestamp`
, total
, ROUND(UNIX_TimeStamp(Timestamp)/180) as roundBy3
, @lastT3 := if(@lastT3 is null, 0, @lastT2) as saveForNext3
, @lastT2 := if(@lastT2 is null, 0, @lastT1) as saveForNext2
, @lastT1 := if(@lastT1 is null, 0, total) as saveForNext1

from `time`
, ( select @lastT1 := null
    , @lastT2 := null 
    , @lastT3 := null ) sqlvars
order by roundBy3 asc, total ASC

最后,我把一切都卷在一起:

代码语言:javascript
复制
select detail.Timestamp
, detail.total
, detail.saveForNext3
, detail.saveForNext2 
from (
    select 
    max(`Timestamp`) AS 'Timestamp'
    ,max(total) as total
    , ROUND(UNIX_TimeStamp(`Timestamp`)/180) as roundBy3
    FROM `time`
    Group by ROUND(UNIX_TimeStamp(`Timestamp`)/180)
    ) summary
join (
    select `Timestamp`
    , total
    , ROUND(UNIX_TimeStamp(Timestamp)/180) as roundBy3
    , @lastT3 := if(@lastT3 is null, 0, @lastT2) as saveForNext3
    , @lastT2 := if(@lastT2 is null, 0, @lastT1) as saveForNext2
    , @lastT1 := if(@lastT1 is null, 0, total) as saveForNext1

    from `time`
    , ( select @lastT1 := null
        , @lastT2 := null 
        , @lastT3 := null ) sqlvars
    order by roundBy3 asc, total ASC 
    ) detail
on summary.roundBy3 = detail.roundBy3 and summary.total = detail.total
group by ROUND(UNIX_TimeStamp(summary.Timestamp)/180);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22725979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档