SQL> desc tab1
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(1000)
SQL> select * from tab1;
ID NAME
---------- ---------------
1 a
2 b
3 c
SQL> select * from tab1 where id > AVG(id);
select * from tab1 where id > AVG(id)
*
ERROR at line 1:
ORA-00934: group function is not allowed here
SQL>
O erro é muito claro e diz que isso não pode ser feito. Mas não vejo por quê. A consulta faz todo o sentido:
selecione todas as linhas
tab1
cujoid
valor é maior que a média
O AVG e outras funções agregadas funcionam em conjuntos de dados. A causa WHERE não tem acesso a todo o conjunto, apenas aos dados da linha em que está operando. Se você criou sua própria função do AVG (como uma função normal e não uma função de agregação personalizada), seria passado apenas um valor de ID quando chamado a partir da cláusula WHERE, não o conjunto inteiro de valores de ID.
A solução do Mezmo fornecerá os resultados esperados, mas se você quiser evitar duas verificações completas da tabela (supondo que não haja índices), poderá usar uma função de janelamento como esta:
Bem, a resposta curta é "Porque Larry diz isso." ;) mas você pode fazer isso com uma seleção aninhada:
HTH