2012-04-25 2 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, чтобы исправить имя.

Объяснение:
Основном Я присоединяюсь таблицу с собой в run DESC порядке, присоединиться к ним на основе ITEM_ID, но и по идентификатору. Затем я снова собираю их, чтобы удалить потенциальные 3-й и т. Д. Случаи. Наконец, я вычисляю разницу между ними через АБС (значение1 - значение2).

+0

Имя столбца * Дата и время * не существует. Вы имели в виду * run * column? И извините, но мне нужно разграничить столбец * value * (name), а не diff * run *. –

+0

При использовании 'GROUP BY' таким образом вы можете рассчитывать на это, чтобы вернуть первую строку группы (где понятие« первым »происходит из заказов, определенных в подзапросах?) – gcbenison

+0

сложно, что ... никогда не знал о ONLY_FULL_GROUP_BY в MySQL http://bugs.mysql.com/bug.php?id=36511. если это был MSSQL, я бы использовал rownumber() over (partition by .., поэтому я не могу действительно жаловаться на использование специфичных для платформы материалов – gordatron

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) 

Это предполагает, что вы хотите, диф между записью и записью с предыдущим перспективе