2010-06-09 32 views
43

estoy tratando de escribir la siguiente consulta en PostgreSQL:¿Cómo hacer una subconsulta de Postgresql en la cláusula de selección con la cláusula join in from como SQL Server?

select name, author_id, count(1), 
    (select count(1) 
    from names as n2 
    where n2.id = n1.id 
     and t2.author_id = t1.author_id 
    )    
from names as n1 
group by name, author_id 

Esto, sin duda trabajar en Microsoft SQL Server pero no en todos en postegresql. He leído su documentación un poco y parece que pude volver a escribir como:

select name, author_id, count(1), total      
from names as n1, (select count(1) as total 
    from names as n2 
    where n2.id = n1.id 
     and n2.author_id = t1.author_id 
    ) as total 
group by name, author_id 

Pero que devuelve el siguiente error en postegresql: "subconsulta en FROM no puede referirse a otras relaciones en el mismo nivel de consulta". Así que estoy atascado. ¿Alguien sabe cómo puedo lograr eso?

Gracias

+0

En realidad parece que este debería funcionar en Postgres (quizás 6 años Hace no :)) – qwertzguy

Respuesta

69

No estoy seguro de entender su intención perfectamente, pero tal vez la siguiente estaría cerca de lo que quiere:

select n1.name, n1.author_id, count_1, total_count 
    from (select id, name, author_id, count(1) as count_1 
      from names 
      group by id, name, author_id) n1 
inner join (select id, author_id, count(1) as total_count 
       from names 
       group by id, author_id) n2 
    on (n2.id = n1.id and n2.author_id = n1.author_id) 

Desafortunadamente esto se suma la exigencia de agrupar la primera subconsulta id, así como nombre y author_id, que no creo que se desee. Sin embargo, no estoy seguro de cómo solucionarlo, ya que necesita tener una identificación disponible para unirse a la segunda subconsulta. Quizás alguien más encuentre una mejor solución.

Comparte y disfruta.

+0

Perfecto Bob, realmente funcionó. ¡Muchas gracias! Tuve que hacer un pequeño cambio porque no necesito la unión con el ID, solo el author_id. Así que la pregunta final es: seleccione n1.name, n1.author_id, recuento_1, TOTAL_COUNT a partir de (SELECT ID, nombre, author_id, count (1) como recuento_1 de nombres grupo por id, nombre, author_id) n1 combinación interna (seleccione author_id, count (1) como TOTAL_COUNT de nombres grupo por author_id) n2 en (n2.author_id = n1.author_id) Ahora que tengo esto, lo que realmente quiero es dividir recuento_1 por TOTAL_COUNT tener una frecuencia normalizada = D –

+0

ops, acaba de darse cuenta de que sql no se formatea correctamente aquí. :( Daré una respuesta para complementar. –

+0

No tuve el problema que estaba hablando Ricado, pero este SQL solucionó totalmente mis problemas ...: D GRACIAS! – tftd

7

sólo estoy respondiendo aquí con la versión formateada del sql final que sea necesario, basándose en la respuesta de Bob Jarvis tal como fue anunciado en mi comentario anterior:

select n1.name, n1.author_id, cast(count_1 as numeric)/total_count 
    from (select id, name, author_id, count(1) as count_1 
      from names 
      group by id, name, author_id) n1 
inner join (select author_id, count(1) as total_count 
       from names 
       group by author_id) n2 
    on (n2.author_id = n1.author_id) 
Cuestiones relacionadas