2013-10-14 4 views
1

Я создал 2 таблицы. одна таблица имеет 4 поля. уникальное имя, дату и 3 цифры. Вторая таблица содержит те же поля, но записывает вывод функции слияния. поэтому имеет дату, когда произошла функция обновления или вставки. то, что я хочу сделать, это получить сумму либо разницы между 2 днями, либо, наоборот, итогов двух дней, чтобы определить, сколько значение изменилось за день. Функция слияния обновляется только в том случае, если значение изменилось или ему необходимо вставить новое значение.SQL change with time query

до сих пор у меня есть этот

select sum(Change_Table_1.Disk_Space) as total, 
Change_Table_1.Date_Updated 

from VM_Info 
left join Change_Table_1 

on VM_Info.VM_Unique = Change_Table_1.VM_Unique 
where VM_Info.Agency = 'test' 
group by Change_Table_1.Date_Updated 

, но это было бы просто вернуть сумму этого дня обновляется общим, а не разница между двумя днями. Одним из ответов на этот вопрос было бы добавить все новые записи в таблицу, но это будет содержать несколько дубликатов. Таким образом, в моей голове то, что я хочу сделать, это цикл по текущим цифрам за день, затем цикл на следующий день, а также включение всех значений, которые не были обновлены. извините, если я не объяснил это хорошо. поэтому я хочу добиться того, чтобы с течением времени меняться. Если его плохая конструкция в состоянии принять это тоже.

Любая помощь очень ценится.

Возможно, это объяснило бы это лучше. покажите мне общее количество за день 1, если значение не изменилось, тогда покажите мне то же значение для дня 2, если оно изменилось, покажите мне новое значение. и так далее ...

ОК, чтобы уточнить.

Change_Table выглядит

vm date created action value_Field1 value_field_2 Disk_Space 


abc 14/10/2013 insert 5 5 30 

def 14/10/2013 insert 5 5 75 

abc 15/10/2013 update 5 5 75 

так из положить, что я хочу для 14 общих для последнего столбца 105. На пятнадцатых а изменились с 30 до 75, но четкостей hasn «т изменились, но все еще Neds быть включены давая 150

поэтому выход будет выглядеть

date  disk_Space 

14/10/2013 105 

15/10/2013 150 
+0

Это называется текущим общим или свертывающим дельта-значением. «def» не существует на 15-м, что означает, что изменений нет, поэтому запрос должен включать предыдущее значение. лучший способ добиться этого - создать недостающие строки, поскольку они существуют. вам понадобится новый столбец RunningTotal по каждому значению. и рекурсивный CTE - это способ пойти для этого вычисления. если у вас есть общее значение для любой заданной даты, то это просто простое сложение или вычитание для любых двух дат. попробуйте, при необходимости предоставит запрос CTE. отдых легко, поэтому вы можете это сделать. –

+0

спасибо за вашу помощь. Я решил пойти с общей общей таблицей и работать с циклом 1,7,14,28 дня. основная идея этого проекта заключалась в том, чтобы получить ... вы выросли на х, тогда все последующие изменения после этого требуют заряда. будет читать на рекурсивном CTE и вернуться, если потребуется ... – TXL

ответ

0

Помогает ли это? Если нет, можете ли вы предоставить несколько строк выборочных данных и пример желаемого результата?

select 
    (VM_Info.Disk_Space - Change_Table_1.Disk_Space) as DiskSpaceChange, 
    Change_Table_1.Date_Updated 
from 
    VM_Info 
    left join Change_Table_1 on VM_Info.VM_Unique = Change_Table_1.VM_Unique and VM_Info.Date = Change_Table_1.Date_Updated 
where 
    VM_Info.Agency = 'test' 
+0

Спасибо Nicholai. его не совсем то, что я искал. добавили примеры того, что мне нужно. таблица VM_info не содержит значений и используется только для того, чтобы я мог включить предложение where в таблицу изменений. – TXL

+0

Благодарим вас за образцы записей и результаты. Как прокомментировал Anup, будет легче выполнять вычисления, если вы заполняете строки для дат, которые не содержат изменений. Затем вы можете использовать один из примеров здесь, чтобы получать ежедневные изменения: http://www.sqlperformance.com/2012/07/t-sql-queries/running-totals – Nicholai