2015-10-18 3 views
0

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

id activity amount 
1 unknown 20   
2 storage 20   
3 storage 20   
4 swift  20   
5 delivery 50   
6 storage 20   

Я хочу создать запрос, который дает мне «вычисленный» сумму. для примера выше .. желаемого результата:

id activity amount calculatedsum 
1 unknown 20   0 
2 storage 20   20 
3 storage 20   20 
4 swift  20   20 
5 delivery 50   70   (had 20 and 50 arrived) 
6 storage 20   70 

логика проста .. найти первую строку, которая является «хранилищем», то есть calculatedsum. когда встречается строка с «доставкой», добавьте ее, а это новый calculatedsum.

Это то, что я пытался сделать:

select *, 
     sum(case when activity = 'Storage' then amount 
       when activity = 'delivery' then + amount 
       else 0 
      end) over (order by id) 
from A 

однако это не работает ...

, как я могу получить ожидаемый результат?

Edit: идентификатор является Колум, которая была создана: select row_number() over (order by .... nulls last) as id таблица содержит результат запроса ... и eveytime запрос выполняется таблица сброшена на него ... так что идентификатор всегда фактическая строка номер.

+0

Где 'swift' приходят из? –

+0

Как вы получаете активность 'unknown' и' swift', когда вы не указали их на вход? Создайте [sqlfiddle] (http://sqlfiddle.com) с правильными данными – Utsav

ответ

0

Если вы только считаете первый 'storage', вам необходимо его идентифицировать. Вы можете сделать это с помощью row_number():

select *, 
     sum(case when activity = 'Storage' and seqnum = 1 then amount 
       when activity = 'delivery' then amount 
       else 0 
      end) over (order by id) 
from (select a.*, 
      row_number() over (partition by activity order by id) as seqnum 
     from A a 
    ) a 

совершенно странный способ сделать это без подзапроса, если предположить, что суммы для storage все равно:

select *, 
     (sum(case when activity = 'delivery' then amount 
       else 0 
      end) over (order by id) + 
     min(case when activity = 'storage' then amount else 0 
      end) over (order by id) 
     ) 
from A a; 
+0

есть ли способ сделать это, используя только Select? Я скорее не прикасаюсь к статусу. Этот новый столбец добавляется к огромному запросу ... Мне это нужно как можно проще, даже если производительность медленнее. Примечание. Идентификатор уже является row_number(), как я его создал. – SMW

+0

Почему «select a. *, row_number() over (раздел по порядку активности по id) как seqnum от A a' важно, если у вас уже есть эта информация в столбце id ... id is infact row_number – SMW

+0

@ SMW. , , Потому что это идентифицирует первую строку, которая имеет 'storage' как активность. –

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