как получить только средние значения из объединенной таблицы

#sql #db2

#sql #db2

Вопрос:

У меня есть следующий запрос:

 with D1 as (
        select v06.ID
            ,AVG(TD.A) as A_avg
            ,AVG(TD.B) as B_avg
        from v06
        inner join v07 TD
            on v06.ID= TD.ID
            and v06.timestamp= TD.timestamp
        where v06.X is not NULL
        group by v06.ID
)
select * from D1
  

Теперь я группирую по v06.ID . Однако я хочу сохранить все поля v06, добавив только два усредненных значения из таблицы TD. Итак, я попытался:

 with D1 as (
        select v06.*
            ,AVG(TD.A) as A_avg
            ,AVG(TD.B) as B_avg
        from v06
        inner join v07 TD
            on v06.ID= TD.ID
            and v06.timestamp= TD.timestamp
        where v06.X is not NULL
        group by v06.*
)
select * from D1
  

Но это дает мне «недопустимый символ *» в инструкции select. Кто-нибудь знает, как этого добиться?

Комментарии:

1. У вас действительно есть это ** в вашем заявлении?

2. Общее правило GROUP BY гласит: «Если указано предложение GROUP BY, каждая ссылка на столбец в списке ВЫБОРА должна либо идентифицировать столбец группировки, либо быть аргументом функции set». Т.е. Вы не можете выбрать все столбцы подобным образом, не перечислив их также в GROUP BY — явно.

3. Нет, это я пытался подчеркнуть, в чем разница между первым и вторым запросом.

Ответ №1:

Как указано в одном из комментариев, у вас не может быть столбца в select, которого нет в GROUP BY предложении или который используется в агрегатной функции.

Попробуйте это:

 with D1 as (
        select v06.ID
            ,AVG(TD.A) as A_avg
            ,AVG(TD.B) as B_avg
        from v06
        inner join P.B90T75 TD
            on v06.ID= TD.ID
            and v06.timestamp= TD.timestamp
        where v06.X is not NULL
        group by v06.ID
)
select d2.*, d1.a_avg, d1.b_avg 
from D1 
     join v06 D2 
       on d1.id = d2.id
  

Ответ №2:

Или, если доступно / поддерживается [неизвестно, если в OP не упоминается платформа или выпуск DB2, и даже не включен тег DB2 для конкретной платформы], возможно, следующий запрос. Примечание: удалите или отрегулируйте скаляр приведения DEC по мере необходимости; Я просто выбрал небольшое значение, чтобы получить лучший размер отчета с моими выборочными данными, потому что в OP не было ни DDL с выборочными данными, ни ожидаемого результата, предлагаемого для тестирования:

 select a.*                                                 
     , dec( avg(a) over(partition by a.id ) , 11 ) as avg_a
     , dec( avg(b) over(partition by a.id ) , 11 ) as avg_b
from v06 as a                                              
join v07 as b                                           
  on a.id = b.id                                           
 and a.timestamp = b.timestamp                             
where x is not null                                        
order by id                                                
  

Комментарии:

1. Спасибо, похоже, это то, что я искал! Я протестирую это позже сегодня.