2016-12-15 73 views
0

我有一個像SQL - 和基於狀態

id | value | date  | type 
---------------------------- 
1 | 2  | 1.1.2016 | 1 
---------------------------- 
2 | 6  | 2.1.2016 | 1 
---------------------------- 
3 | 1  | 7.1.2016 | 1 
---------------------------- 
4 | 10 | 3.1.2016 | 2 
---------------------------- 
5 | 8  | 8.1.2016 | 1 

我需要編寫一個查詢,是可以獲得式佈置1條目的表格,這些條目沒有一個類型多行它們之間的2個條目在同一行上相加。在我的例子中,查詢將返回

sum | start | end 
------------------------- 
8 | 1.1.2016 | 2.1.2016 
------------------------- 
9 | 7.1.2016 | 8.1.2016 
+5

你有什麼迄今所做.. –

+0

我不明白你的例子。它不應該是'9,'1.1.2016','7.1.2016'和'8,'8.1.2016','8.1.2016'嗎? – pozs

+0

他希望通過日期範圍,而不是id。 – BinaryPatrick

回答

1

您可以通過該行前計算非1值的數量確定每個組。其餘的就是聚集:

select sum(value), min(date), max(date) 
from (select t.*, 
      sum(case when type <> 1 then 1 else 0 end) over (order by id) as grp 
     from t 
    ) t 
where type = 1 
group by grp; 
+0

這是一個非常優雅的方式來做到這一點,它也確實表現出色。雖然要得到所要求的分組,但我認爲它需要按照如下日期: 'SUM(Case when when type = 1 then 0 else 1 END)OVER(ORDER BY Date)Grp' 我也顛倒了案例邏輯,因爲我認爲它讀得更乾淨。 – BinaryPatrick

-1

你可以嘗試lead()功能類似下面的查詢

select 
     value+lead_value as value, 
     date as start_date, 
     end_date 
from(
    select *, 
      lead(value) over(order by id asc) lead_value, 
      lead(date) over(order by id asc) end_date, 
      ROW_NUMBER() over(partition by t order by id asc) row_num 
    from t1 
    where type = 1)t2 
where row_num % 2 = 1; 

這給了我下面的結果

enter image description here

+0

對於大集合,使用這種許多窗口函數並不那麼高效。 – BinaryPatrick