2015-07-10 3 views
0

В Oracle мне нужно выполнить среднее значение столбца (timeInmillis) из запроса соединения, который показывает «дублированные» значения (относительно столбца timeInmillis из таблицы 1). Мне нужно передать значения из соединения, но получить правильный результат для среднего.Применить Substr к отчетливому результату в оракуле

Я пытаюсь сделать что-то вроде этого:

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 

Table2:

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

С моей присоединиться я получаю ResultSet так:

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

Мне нужно, чтобы получить среднее значение 5 и 15 (с отчетливым id1), но я не может изменить, где часть sql (причина других значений, которые я получаю)

My result should be: 

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

Спасибо заранее.

+1

DISTINCT не является функцией в столбце, он работает для всей выбранной строки. Можете ли вы предоставить образцы данных и ожидаемый результат, и мы, возможно, поймем, что вы делаете. – jarlh

+0

это немного сложно объяснить, но я отредактировал вопрос, чтобы сделать это. – elcadro

+0

Я все еще не понимаю. «Пропуск 5 и 15 (с отдельным id1)»? Что нужно делать с идентификатором 1? И почему существуют два идентификатора? В вашем примере запроса вы присоединяете две таблицы с их идентификаторами * matching *; в ваших образцовых данных у вас есть записи с * разными * идентификаторами.Не могли бы вы еще раз изменить свой вопрос и рассказать нам, что вы пытаетесь сделать? –

ответ

1

Ваш синтаксис неверен. Вы можете попробовать Somthing как это либо: -

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

+0

Я знаю, что это неправильно, поэтому я спрашиваю, как это сделать. Ваш запрос не то, что я пытаюсь сделать, мне нужно сделать различные значения, а затем выбрать некоторые символы набора результатов. Спасибо в любом случае ... – elcadro

+0

Теперь посмотрим мое редактирование. –

+0

Еще раз спасибо. Ваше решение действительно работает со значением avg, но не решает проблемы. Мне нужно передать «группу за» внутренним выбором, а значения внешнего выбора должны показывать результаты «по группам» по внутреннему запросу, а не только по среднему времени. Я думаю, что нет способа сделать то, что я пытаюсь сделать, не переписывая полностью запрос ... – elcadro

2

1) Вариант

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

2) Вариант

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

*) запросы могут вернуть другой результат.

+0

Первый - это хорошо, но я не могу использовать его для решения моей проблемы. Второй, это не то, что я пытаюсь сделать ... Спасибо в любом случае – elcadro

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 
); 

Другим решением было бы переписать запрос.

+0

Дело в том, что я не могу группироваться по id1, couse У меня есть другая группа по определенным предложениям, и я не могу их изменить. Другие значения зависят от таблицы соединений. Я знаю, это звучит странно, но это то, что есть. Я начинаю думать, что я не могу делать то, что мне нужно ... – elcadro

+1

Что бы вы ни группировали, это должно быть во внутреннем запросе. Вы должны иметь возможность заменить 'query' в' from (query) 'на ваш полный запрос. Таким образом, существующее предложение GROUP BY не мешает. Но да, возможно, вам нужны агрегаты, которые вы потеряете в описанном процессе. Тогда переписывание запроса будет вашим единственным вариантом. –

Смежные вопросы