2015-07-13 2 views
1

Вот пример того, что я ищу:Как выбрать разницу между двумя строками?

У меня есть данные, которые поступают как общая сумма в галлонах. Я хочу иметь возможность отображать данные в качестве общей суммы за период времени, который я выбираю, а не как общее время жизни. Например:

timestamp lifetimeTotal  runningTotal 
1:30   3000     0 
1:31   3001     1 
1:32   3005     5 
1:33   3010     10 

Я не уверен, как это сделать. Я рассматривал такие примеры, как this one, используя over, но это не совсем то, что я ищу: я не хочу добавлять строки вместе каждый раз, вместо этого хочу добавить разницу между двумя строками. Сейчас я просто выбираю итоговые итоги жизни и показываю это.

Любые идеи? Я добавлю код, если необходимо, но не так много, чтобы показать, кроме моего оператора select; У меня возникли проблемы с мыслью о том, как сделать это концептуально.

+0

вывесить вывод, что вы хотите ?? – mohan111

+0

да, но что это значит, запустив общее количество ничего не добавляло для этого просто показывая 0,1,5 и т. Д. – mohan111

+0

@ mohan111 это разница между строками в полноте жизни, если вы можете подумать о лучшем имени для объяснения, не стесняйтесь edit –

ответ

2

Это должно дать разницу между текущим lifetimeTotal и мин lifetimeTotal

SELECT timestamp, 
     lifetimeTotal, 
     lifetimeTotal - MIN(lifetimeTotal) OVER() as runningTotal 
FROM Table 
+1

Я вижу, что это потенциально может быть проблемой, если по какой-то причине итоговые суммы должны были * уменьшаться *, а не * увеличивать *. – Siyual

+0

Это очень верно. – JamieD77

+0

Для чего это стоит, это не проблема для меня, в частности :) значения всегда будут расти. Я собираюсь попробовать это, спасибо –

2

Это можно легко сделать с помощью окна функции:

SELECT [timestamp], lifetimeTotal, 
     COALESCE(SUM(diff) OVER (ORDER BY [timestamp]), 0) AS runningTotal 
FROM (
SELECT [timestamp], 
     lifetimeTotal, 
     lifetimeTotal - LAG(lifetimeTotal) OVER (ORDER BY [timestamp]) AS diff 
FROM mytable) t 

приведенных выше запрос использует LAG для вычисления разницы между текущей и предыдущей строкой. SUM OVER затем используется во внешнем запросе для вычисления текущей суммы разницы.

Demo here

+0

Это именно то, что я ищу. Кажется, что он работает для первых нескольких записей, но потом он становится все странным ... после десятой строки (с правильной скоростью до тех пор) он перескакивает с 8 на -105087, и после этого он просто остается в огромных негативах. . lifetimeTotal растет нормально, не уверен, почему это произойдет. Единственное отличие между нашим кодом заключается в том, что я использую десятичное значение, потому что по какой-то причине lifetimeTotal хранится как varchar. –

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