2012-04-25 40 views

回答

3
SELECT item_id, ABS(value1 - value2) AS diff 
FROM ( SELECT h.item_id, h.value AS value1, h2.value AS value2 
     FROM ( SELECT id, item_id, value 
       FROM table_name 
       GROUP BY item_id 
       ORDER BY run DESC) AS h 
     INNER JOIN ( SELECT id, item_id, value 
         FROM table_name 
         ORDER BY run DESC) AS h2 
     ON h.item_id = h2.item_id AND h.id != h2.id 
     GROUP BY item_id) AS h3 

我相信這應該對你有用。只需將table_name替換爲正確的名稱即可。

說明:
Basicly我加入表本身在run DESC秩序的基礎上,ITEM_ID而且對ID加入他們的行列。然後,我再次GROUP BY他們以消除潛在的第三等案件。最後,我通過ABS計算它們之間的差異(value1 - value2)。

+0

列名*日期時間*不存在。你的意思是*運行*列嗎?抱歉,但我需要*值*(名稱)列不差*運行*列之間的差異。 – 2012-04-25 12:10:02

+0

以這種方式使用GROUP BY時,你能指望它返回組的第一行嗎(其中「first」的概念來自子查詢中定義的順序?) – gcbenison 2012-04-25 12:12:09

+0

棘手的一個......從來不知道MySQL中的ONLY_FULL_GROUP_BY http://bugs.mysql.com/bug.php?id=36511。如果這是MSSQL我會使用rownumber()(分區由..所以我真的不能抱怨使用平臺特定的東西 – gordatron 2012-04-25 12:20:24

1
SELECT t2.id, t2.item_id, (t2.value- t1.value) valueDiff, t2.run 
    FROM (table_name AS t1 
      INNER JOIN 
      table_name AS t2 
      ON t1.run = (SELECT MAX(run) FROM table_name where run < t2.run) 
       and t1.item_id = t2.item_id) 

這是假設你想記錄和記錄之間的差異與以前運行