У меня есть таблица с id, item_id, value (int), run (datetime)
и мне нужно выбрать значение дифф betwen двух последних выполнения пер * item_id *.значение Diff последние две записи по DateTime
2
A
ответ
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).
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)
Это предполагает, что вы хотите, диф между записью и записью с предыдущим перспективе
Имя столбца * Дата и время * не существует. Вы имели в виду * run * column? И извините, но мне нужно разграничить столбец * value * (name), а не diff * run *. –
При использовании 'GROUP BY' таким образом вы можете рассчитывать на это, чтобы вернуть первую строку группы (где понятие« первым »происходит из заказов, определенных в подзапросах?) – gcbenison
сложно, что ... никогда не знал о ONLY_FULL_GROUP_BY в MySQL http://bugs.mysql.com/bug.php?id=36511. если это был MSSQL, я бы использовал rownumber() over (partition by .., поэтому я не могу действительно жаловаться на использование специфичных для платформы материалов – gordatron