2015-10-18 54 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 

但是這不工作...

我怎麼能得到預期的結果?

編輯:id是由創建的列:select row_number() over (order by .... nulls last) as id 該表包含查詢的結果...和eveytime查詢運行表復位它...因此,id始終是實際的行數。

+0

哪裏'swift'來從? –

+0

當你沒有給他們輸入時,你是如何獲得「未知」和「快速」活動的?請使用正確的數據創建[sqlfiddle](http://sqlfiddle.com) – Utsav

回答

0

如果您只計算第一個'storage',那麼您需要確定它。你可以做,使用row_number():這樣做沒有一個子查詢,如果我們假設爲storage的數額是

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 

一個完全不可思議的方式都是一樣的:

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?我寧願不要觸及自己的陳述。這個新列被添加到一個巨大的查詢中......即使性能較慢,我也需要儘可能簡單。注意:ID已經是row_number(),這是我生成它的方式。 – SMW

+0

爲什麼選擇a。*, row_number()over(按活動順序按ID分區)如果seqnum from a a' 重要的是,如果您已在id列中具有該信息... id是infact row_number – SMW

+0

@ SMW。 。 。因爲這確定了具有「存儲」作爲活動的第一行。 –

相關問題