2016-04-23 18 views
0

Я хочу найти последнюю и вторую последние значения значений столбцов для типа группы. И граф тип должен больше 1.Последние и последние последние значения столбцов

Рассмотрим этот пример данных в моей таблице:

type value  date 
-------------------------------- 
2  5 2015-05-09 12:42:00 
4  -42 2015-05-09 13:19:57 
2  2 2015-05-09 14:48:30 
2  7 2015-05-09 12:54:39 
3  16 2015-05-09 13:19:57 
3  20 2015-05-09 15:01:09 

я хотел бы результат быть

type Value 
--------------------- 
    2  -5 
    3  4 

т.е. для типа 2, последнее значение равно 2, а второе последнее значение равно 7, поэтому разница между ними равна -5.

+0

Пожалуйста, добавьте запрос, который вы попробовали/узнали сами. – Sebastian

+0

Дата должна быть уникальной в пределах группы, иначе это не детерминированная задача .... –

ответ

0

Вы можете использовать переменные, чтобы уменьшить количество сканирований таблиц необходимое:

SELECT type, 
     value 
FROM ( SELECT @n := IF(type = @t, @n+1, 1) as num, 
       @t := type     as type, 
       @v - value     as value, 
       @v := value 
     FROM  mytable 
     ORDER BY type, 
       date DESC) base 
WHERE num = 2 

SQL Fiddle

Идея заключается в том, чтобы дать записывает номер записи, что для каждое различное значение тип начинается с 1 снова, а затем увеличивается с нисходящими значениями даты.

три переменные обновляться при прохождении записей в порядке типа и порядок даты по убыванию:

  • @n: номер записи заданного к предыдущей записи;
  • @t: значение тип столбец в предыдущей записи;
  • @v: значение значение column в предыдущих записях;

Все три обновляется следующим образом:

Если для текущей записи значения типа такого же, как и в предыдущей записи, то @n возрастает с одним, в противном случае он сбрасывается 1.

Для каждой записи также возвращается разница между значением текущей и предыдущей записи.

тип и значение обновляются, чтобы отражать значения текущей записи.

И, наконец, в результирующем наборе сохраняются только записи с номером два.

0
select t1.type, t1.value - t2.value as value 
from mytable t1 
join mytable t2 using(type) 
where t1.date = (
    select max(date) 
    from mytable t1m 
    where t1m.type = t1.type 
) 
    and t2.date = (
    select max(date) 
    from mytable t2m 
    where t2m.type = t1.type 
     and t2m.date <> t1.date 
) 

http://www.sqlfiddle.com/#!2/5a3298/2

Смежные вопросы