2013-05-11 30 views
0

我已經在這個幾個小時,無濟於事,把我的頭髮拉出來。Mysql使用從min時間戳中選擇的行減去值,按id編組

編輯:林希望通過使用從1天前相同的數據來計算每個用戶

目前我正在採取行最大的「收穫」來計算overall_exp柱之間的差別,然後選擇1天前的基於行的第一行時間戳然後減去從2行,以便通過該結果對overall_exp列,而由USER_ID分組

SQL小提琴:http://sqlfiddle.com/#!2/501c8

這是我現在有,但是邏輯是完全錯誤的,所以我拉0結果

SELECT rsn, ts.timestamp, @original_ts := SUBDATE(ts.timestamp, INTERVAL 1 DAY), ts.overall_exp, ts.overall_exp - previous.overall_exp AS gained_exp 
    FROM tracker AS ts 
INNER JOIN (
    SELECT user_id, MIN(TIMESTAMP) , overall_exp 
    FROM tracker 
    WHERE TIMESTAMP >= @original_ts 
    GROUP BY user_id 
) previous 
    ON ts.user_id = previous.user_id 
JOIN users 
    ON ts.user_id = users.id 
GROUP BY ts.user_id 
ORDER BY gained_exp DESC 
+1

SQLFiddle中的所有示例數據均爲同一天(2013年5月11日),因此無論您對其執行哪種查詢,在任何給定行的時間戳之前的某一天,都不會得到任何行。另外,這還遠遠不清楚**你試圖達到什麼樣的目標 - 你現有的問題只描述**你試圖達到的目標。 – 2013-05-11 15:05:44

+0

已更新的OP和SQLFiddle – Wader 2013-05-11 15:22:55

+0

謝謝,這很清楚,但它仍然有點不清楚 - 您是否希望每位用戶每天有一行,如果有的話,您希望從哪一天哪個時間戳與前一天的哪個時間戳進行比較?或者,您是否希望結果集中的一行記錄在「tracker」中的每一行中,將每一行中的日期和時間與前24小時內的最早日期和時間進行比較(這似乎是發佈的查詢背後的邏輯) ?或者是其他東西? – 2013-05-11 15:35:20

回答

1

您可以用自聯接做到這一點:

select t.user_id, max(t.overall_exp - tprev.overall_exp) 
from tracker t join 
    tracker tprev 
    on tprev.user_id = t.user_id and 
     date(tprev.timestamp) = date(SUBDATE(t.timestamp, INTERVAL 1 DAY)) 
group by t.user_id 

一個關鍵這裏轉換時間戳日期,因此比較準確。

1

嘗試:

select u.*, max(t.`timestamp`)-min(t.`timestamp`) gain 
from users u 
left join tracker t 
on u.id = t.user_id and 
    t.`timestamp` >= date_sub(date(now()), interval 1 day) and 
    t.`timestamp` < date_add(date(now()), interval 1 day) 
group by u.id 
order by gain desc 

SQLFiddle here