2014-01-13 16 views
0

我有一個表中Oracle 100.000加上行。 表有40個變量:最有效的方法來創建一個視圖與多行不同的結果

var1 var2 var3  var4 var5 ... varN 
1  10 1.1.2011 2  1 
1  10 1.2.2011 3  2 
2  10 1.5.2012 2  1 
2  20 1.1.2013 3  2 
2  20 1.3.2013 6  3 
3  10 ..  .. .. 
4  10  
4  10  
4  10  
4  20  
4  30  
4  30  
5  10  
6  10  
7  10  
7  20  
... 

結果我試圖得到的是每一個獨特的VAR1不同VAR2:

var1 var2 
1  10 
2  10 
2  20 
3  10 
4  10 
4  20 
4  30 
... 

和最早的日期(VAR3)和VAR5從同一行對於每個不同的VAR2
和max VAR4爲每個不同的VAR2

結果應該是:

var1 var2 var3  var4 var5 ... varM 
1  10 1.1.2011 3  1 
2  10 1.5.2012 2  1 
2  20 1.1.2013 6  2 
... 

我想從這些結果中創建一個視圖,那麼最有效的方法是什麼?該視圖將經常被查詢,所以它必須是有效的。要做到這一點

+0

我們希望'var3'是一個實際的日期/時間戳類型,而不是那種格式的varchar ......它不是很好rtable。將來,請使用ISO('YYYY-MM-DD')使其更清楚,並防止混淆您的示例數據是mdy還是dmy ... –

+0

Var3是日期變量。我以這種格式查看結果,並忘記把它放在iso格式中。感謝您指出這一點。 – thorgilsv

回答

3

一種方法是使用條件聚集一起使用row_number()

select var1, var2, 
     min(var3) as var3, 
     max(case when seqnum = 1 then var4 end) as var4 
     max(var5) as var5 
from (select t.*, 
      row_number() over (partition by var1, var2 order by var3) as seqnum 
     from t 
    ) t 
group by var1, var2; 

您也可以使用first這樣寫:

select var1, var2, 
     min(var3) as var3, 
     min(var4) keep (dense_rank first order by var3) as var4, 
     max(var5) as var5 
from t 
group by var1, var2; 
+0

非常感謝,兩者都很完美。看起來後者稍快,但我必須更好地測試它。 – thorgilsv

0

嘗試此查詢:

SELECT tab.var1,tab.var2,tab.var3,tab.var4,t.var5,...,t.varN FROM 
(SELECT var1,var2,MIN(var3) as var3,MAX(var4) as var4 FROM TABLE1 GROUP BY var1,var2)tab 
INNER JOIN TABLE1 t ON tab.var1 = t.var1 and tab.var2 = t.var2 and tab.var3 = t.var3 
相關問題