2014-01-21 35 views
1

我鄰桌%的差別:獲取的最後一個記錄

+----+-----------+------------+-----------+ 
| ID | market_id | last_value | timestamp | 
+----+-----------+------------+-----------+ 
| 1 | 1  |  10  | 1001 | 
| 2 | 1  |  15  | 1002 | 
| 3 | 1  |  25  | 1003 | 
| 4 | 1  |  30  | 1004 | 
| 5 | 1  |  05  | 1005 | 
+----+-----------+------------+-----------+ 

而且我的想法是類似的東西這樣的:

SELECT id, market_id, last_value, timestamp from data_markets 
where from_unixtime(timestamp, '%d-%m-%Y %H:%m:%s') >= DATE_FORMAT(NOW(),'%d-%m-%Y 00:00:00') and market_id = 1 

有了這個,我今天得到的所有行但我知道作爲使用加入了得到這樣的:

+---+----------------------+--------------------+----------+ 
| market_id | change | total_change | is_down | 
+-----------+--------------+--------------------+----------+ 
|  1  |  83.3% |  -50.00%  | true | 
+-----------+--------------+--------------------+----------+ 

說明:

  • 變化:這個值是最後一排

  • Total_change的區別:這個值是所有行的「24小時」

  • 的差別了下來:它可能知道是否值是增加還是減少尊重總變化?

編輯:

我編輯的例子,在total_change我喜歡包含所有行的差異,但這是不可能的,可與第一排的差異。

+0

究竟你在過去的24小時總的變化是什麼意思?如果在過去的24小時內同時出現更大,更小的價值呢?這會產生兩個非常不同的總變化值。或者你的意思是24小時平均值? – omgitsfletch

+1

@Jay:我想他想比較一行和其他行,並打印更改百分比(%)的變化。如果最後一個值是10,倒數第二個值是20,那麼這個更改是100%(我認爲)。total_change是整個1天的這個百分比。 –

回答

1

下面是一個查詢,我認爲你可以給你最想要的東西。

SELECT 
    dm.id, 
    dm.market_id, 
    dm.last_value, 
    (@prev_value := (SELECT last_value FROM data_markets WHERE (id < dm.id AND market_id = dm.market_id) ORDER BY id DESC LIMIT 1)) AS prev_value, 
    ROUND((@24hr_value := (SELECT AVG(last_value) FROM data_markets WHERE (timestamp >= (dm.timestamp - 86400) AND timestamp < dm.timestamp AND market_id = dm.market_id))),1) AS 24hr_value, 
    ROUND(IF(@prev_value,(((dm.last_value - @prev_value)/@prev_value) * 100),0),1) AS percent_change, 
    ROUND((@24hr_change := IF(@24hr_value,(((dm.last_value - @24hr_value)/@24hr_value) * 100),0)),1) AS 24hr_change, 
    IF(@24hr_change < 0, 'down', IF(@24hr_change > 0, 'up', '-')) AS direction 
FROM 
    data_markets dm, 
    (SELECT 
     @prev_value:=0, 
     @24hr_value:=0, 
     @24hr_change:=0 
    ) r 
WHERE 
    dm.market_id = 1 
ORDER BY 
    dm.id ASC 

您沒有解釋訂單應該如何確定行的「先前」值。我以爲你想通過前面的數字id的價值確定這一點,並確保market_id是一樣的。讓我知道我是否被誤解,這是另一回事。然後,我計算最後一個值的百分比變化,以及過去24小時的AVERAGE最後一個值的百分比變化。最後,24小時百分比確定「方向」欄。這裏的輸入數據,略有你提供了什麼扭捏:

=========================================== 
|id | market_id | last_value | timestamp | 
=========================================== 
|1 | 1   | 10   | 1290347095 | 
|2 | 1   | 15   | 1370347095 | 
|3 | 1   | 25   | 1390345341 | 
|4 | 1   | 30   | 1390346043 | 
|5 | 1   | 5   | 1390347095 | 
=========================================== 

而最終的結果集:

=============================================================================== 
|id | market_id | last_value | prev | 24hr | change | 24hr_change | direction | 
=============================================================================== 
| 1 | 1   | 10   | NULL | NULL | 0.0 | 0.0   | -   | 
| 2 | 1   | 15   | 10 | NULL | 50.0 | 0.0   | -   | 
| 3 | 1   | 25   | 15 | NULL | 66.7 | 0.0  | -   | 
| 4 | 1   | 30   | 25 | 25.0 | 20.0 | 20.0  | up  | 
| 5 | 1   | 5   | 30 | 27.5 | -83.3 | -83.6  | down  | 
=============================================================================== 
+0

真棒,這看起來不錯! – Bayer