创建具有多行不同结果的视图的最有效方法

时间:2014-01-13 12:07:27

标签: sql oracle select view distinct

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

我想从这些结果中创建一个视图,那么最有效的方法是什么?该视图将经常被查询,因此必须高效。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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