将Substr应用于oracle中的不同结果

时间:2015-07-10 08:01:26

标签: sql oracle distinct substr

在Oracle中,我需要从显示“重复”值的连接查询(相对于table1中的timeInmillis列)执行列的平均值(timeInmillis)。我需要保留连接中的值,但是得到平均值的正确结果。

我正在尝试做这样的事情:

select AVG(SUBSTR(DISTINCT(concat(id1,timeInMillis)),LENGTH(id1)+1,LENGTH(CONCAT(id1,timeInMillis)))), someColumn, otherColumn 
FROM table1 t1
LEFT JOIN table2 t2  ON t1.id1 = t2.id1 group by somestuff,someotherStuff;

如果我尝试这样做,我会得到:

  

ORA-00936:缺少表达

这是一个例子:

表1:

id1 timeInMillis otherColumn
1       5            X
2       15           X

表2:

id2  id1 otherColumn
--------------------
1     1       X
2     1       X
3     2       X 

从我的加入我得到这样的结果集:

id1 id2 timeInmillis moreColumns
--------------------------------
1    1      5           X
1    2      5           X  
2    3      15          X 

我需要获得5和15的平均值(具有不同的id1),但我无法修改sql的where部分(我得到的其他值的原因)

My result should be:

AVG(TIMEINMILLIS)    otherResults
----------------------------------  
10                   'whatever'

提前致谢。

3 个答案:

答案 0 :(得分:2)

1)选项

 select  SUBSTR(someColumn,n,m) from ( 
      select DISTINCT someColumn  from MYTABLE
    );

2)选项

select DISTINCT SUBSTR(someColumn,n,m) from MYTABLE;

*)查询可以返回不同的结果。

答案 1 :(得分:1)

你的语法错了。您可以尝试这样的事情: -

select avg(TimeInMillis), other_cols_as_well
from(SELECT TAB1.id1, TAB2.id2, avg(TimeInMillis) as TimeInMillis
FROM TAB1, TAB2
WHERE TAB1.id1 = TAB2.id1
group by TAB1.id1, TAB2.id2) temp
where temp.id1 <> temp.id2
group by other_cols_as_well

这是小提琴 http://sqlfiddle.com/#!4/1fc017/16

答案 2 :(得分:1)

您的上一次编辑最终清楚地解释了您想要的内容。你只需要一行,显示table1的值的平均值,但当然没有因为加入表2而得到的重复。

一种解决方案是分两步获得最终值:

select avg(distinct_time), sum(sub_sum)
from
(
  select max(timeinmillis) as distinct_time, sum(some_other_colum) as sub_sum
  from (query)
  group by id1
);

另一种解决方案是重写查询。