在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'
提前致谢。
答案 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
答案 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
);
另一种解决方案是重写查询。