2015-11-05 41 views
0

這個問題起初看起來非常簡單,但是隨着您開始編寫複雜命中。我已經附上了我的SQL結果集的圖片。結果是39行。我需要將同一個塊的所有連續行與相同的值結合起來。在這個例子中,最終的結果應該是29行,其中下面所有紅色框的行應該合併爲1行。SQL - 將相同塊的連續幾個月的數量相加,並且數量相同

因此,例如與數量第一的Redbox = 40應合併成1排與term_start = 2017年6月1日和term_end = 2017年8月1日

enter image description here

這裏是我的代碼

SELECT 
pp.position 
, term_start = pq.begtime 
, term_end = pq.endtime 
, quantity = CONVERT(VARCHAR,convert(double precision, pq.energy)) 
, block = p.block   
FROM trade t 
    INNER JOIN position p on p.trade = t.trade 
    INNER JOIN powerposition pp on p.position = pp.position 
    INNER JOIN powerquantity pq on pq.position = pp.position 
     AND pq.posdetail = pp.posdetail 
     AND pq.quantitystatus = 'TRADE' 
WHERE 1=1 
AND p.positionmode = 'PHYSICAL' 
AND t.collaboration = 13119572 

我一直被困在這個問題上連續三天了。我已經探索過使用CTE和Row_Number()over(),但沒有成功。任何幫助將不勝感激!!

+0

沒有意義。考慮'pp.position'。 (在你做之後,* simple *解決方案是'group by') – Amit

+0

你使用了哪個數據庫?請標記你的問題。 (我猜Postgres。) –

+0

你想返回哪個'position'和'block'值? – sgeddes

回答

1

您正在查找連續值。以下是一種使用行號區別來識別組的方法:

with t as (<your query here>) 
select min(term_start), max(term_end), block, quantity 
from (select t.*, 
      (row_number() over (partition by block order by position) - 
       row_number() over (partition by quantity, block order by position) 
      ) as grp 
     from t 
    ) t 
group by quantity, grp, block; 
+0

謝謝!如果我在最後添加一個塊,term_start,這將起作用。唯一的缺點是它沒有原始結果集的順序,但現在它首先按塊進行排序。但它應該仍然有效! – Jack89515

+0

@ Jack89515。 。 。您可以添加'按分(位置)'排序。 –