2014-09-11 2 views
0

Предположим, что у меня есть следующая таблица (см. Ниже), и я хочу найти записи, в которых «memsize» или «totalstorage» для одного и того же компьютера (= то же значение vmnaam) изменилось.Вычислить разницу между двумя строками того же типа

ID VMNaam Memsize totalstorage dataentrytime 
1  x  12   150   blabla 
2  x  12   150   blabla 
3  x  14   150   blabla 
4  Y  12   150   blabla 
5  Y  20   150   blabla 
6  Y  18   150   blabla 

Следующий запрос находит эти строки

SELECT realTable.VMnaam, 
      realTable.memsize, 
      realTable.totalstorage 

    FROM  vmresourcetest realTable 
       LEFT OUTER JOIN (
       SELECT (ID+1) AS 'virtualId', 
          (ID) AS 'realId', 
          vmnaam AS 'vmnaamVirtual', 
          memsize AS 'virtualMemsize', 
          totalstorage AS 'virtualTotalstorage' 
       FROM  vmresourcetest 
       ORDER BY vmnaam 
      ) virtual 
       ON virtual.virtualId = realTable.id and virtual.vmnaamVirtual = realTable.vmnaam 
    where IFNULL((realTable.memsize - virtual.virtualMemsize), 0) <> 0 or IFNULL((realTable.totalstorage - virtual.virtualTotalstorage), 0) <> 0 

Однако, когда ряды машины перемешаны, мой запрос, очевидно, больше не работает, так как идентификатор предыдущей записи машины может быть идентификатором другая машина

Например

1 x blablabla 
2 y blablalba 
3 y blablabll 
4 x blablbla 

я как-то нужно изменить идентификатор +1 в (выберите id из realtable, где id> id), но это не работает. Любые идеи о том, как исправить мою проблему?

+0

Посмотрите на ответы здесь: http://stackoverflow.com/questions/25790710/sql-for-setting-column-value-same-as- next-rows-column-value/25791083 # 25791083 Вопрос не совсем то же самое, но я думаю, что общий подход должен помочь вам. – Barmar

ответ

0

Это должно вас происходит:

SELECT curr.VMnaam, 
     curr.memsize, 
     curr.totalstorage 

FROM vmresourcetest curr LEFT JOIN 
     vmresourcetest nxt ON curr.id < nxt.id 
        AND curr.vmnaam = curr.vmnaam 
        AND (curr.memsize != nxt.memsize 
          OR curr.totalstorage != nxt.totalstorage) 
AND NOT EXISTS (-- there is no record between current and next record 
     SELECT * 
     FROM vmresourcetest 
     WHERE id > curr.id AND id < nxt.id AND vmnaam = curr.vmnaam) 
Смежные вопросы