【问题标题】:Most efficient way to create a view with distinct results from multiple rows创建具有多行不同结果的视图的最有效方法
【发布时间】:2014-02-01 04:13:43
【问题描述】:

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

我想根据这些结果创建一个视图,那么最有效的方法是什么?视图会经常被查询,所以它必须是高效的。

【问题讨论】:

  • 我们希望var3 是一个实际的日期/时间戳类型,而不是那种格式的 varchar……它不能很好地排序。将来,请使用 ISO (YYYY-MM-DD) 使这一点更清晰,并防止混淆您的示例数据是 mdy 还是 dmy...
  • Var3 是一个日期变量。我以这种格式查看结果并忘记将其放入 iso 格式。感谢您指出这一点。

标签: sql oracle select view distinct


【解决方案1】:

一种方法是使用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;

【讨论】:

  • 非常感谢,两者都能完美运行。后者似乎稍微快一些,但我必须更好地测试它。
【解决方案2】:

试试这个查询:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-27
    • 2022-08-19
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多