簡體   English   中英

創建具有多行不同結果的視圖的最有效方法

[英]Most efficient way to create a view with distinct results from multiple rows

我在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
...

以及每個不同var2的同一行中最早的日期(var3)和var5
和每個最大var2的最大var4

結果應為:

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
...

我想根據這些結果創建一個視圖,那么最有效的方法是什么? 經常會查詢該視圖,因此必須高效。

一種方法是將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;

試試這個查詢:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM