簡體   English   中英

根據時間戳列選擇不同的最新兩行

[英]Select the distinct latest 2 rows based on the timestamp column

我有一張下面的桌子。 我想提取具有相同ID的最新(基於時間)2行。 如果沒有相同的行,則不返回任何內容。 然后減去第二行的最新行的值,並返回包含ID和值結果的表。

下表是表格。 第一列是ID。 第二是價值,第三是時間。 ID不是主要的也不是唯一的

Id value  time
3   2   2019-01-11 18:59:07.403
2   7   2019-01-10 18:58:40.400
4   5   2019-01-12 18:58:42.400
2   2   2019-01-11 18:59:23.147
5   -5  2019-01-12 18:58:42.400
3   8   2019-01-12 18:59:27.670
2   5   2019-01-12 18:59:43.777

結果應該是

id  value
2   3
3   6

一種可能的解決方案是使用聚合來獲取多次出現的ID,並將子查詢與ORDER BYLIMIT相關聯以獲取最新值和第二最新值。

SELECT x.id,
       (SELECT t.value
               FROM elbat t
               WHERE t.id = x.id
               ORDER BY t.time DESC
               LIMIT 0, 1)
       -
       (SELECT t.value
               FROM elbat t
               WHERE t.id = x.id
               ORDER BY t.time DESC
               LIMIT 1, 1) value
       FROM (SELECT t.id
                    FROM elbat t
                    GROUP BY t.id
                    HAVING count(*) > 1) x;

分貝<>小提琴

在MySQL 8+中,您可以使用窗口函數和條件聚合

select t.id,
       sum(case when seqnum = 1 then value else - value end) as diff
from (select t.*,
             row_number() over (partition by id order by time desc) as seqnum             
      from elbat t
     ) t
where seqnum in (1, 2)
group by id
order by max(time) desc
limit 2;

可以使用變量將相同的想法應用於早期版本:

select t.id,
       sum(case when seqnum = 1 then value else - value end) as diff
from (select t.*,
             (@rn := if(@i = id, @rn + 1,
                        if(@i := id, 1, 1)
                       )
             )  as seqnum             
      from (select t.* from elbat t order by id, time desc) t cross join
           (select @i := -1, @rn := 0) params
     ) t
where seqnum in (1, 2)
group by id
order by max(time) desc
limit 2;

暫無
暫無

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

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