簡體   English   中英

MYSQL-確定行中的先前值

[英]MYSQL - Determining previous values in a row

在將時間戳分組為3分鍾后,我希望連續確定前兩個值; 例如使用下表

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分鍾的組,並顯示每個3min組的最大總計為

SELECT 
    max (Timestamp)
     AS tstamp
     max(total)
FROM table
Group by ROUND(UNIX_TimeStamp(timestamp)/180)

給定的輸出是

 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分鍾組中添加之前的2個值,以便找到最大值,因此我得到了

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

       .                

我一直認為,一種方法是在嵌套選擇中使用max(timestamp)-INTERVAL 1 MINUTE,然后再使用max(timestamp)-INTERVAL 2 MINUTE。 遵循這些原則,但我不確定該方法

有沒有更簡單/更清潔的方法來解決這個問題?

所以我從你擁有的開始:

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

然后,我添加了更多詳細信息:

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

最后,我將所有內容匯總在一起:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM