Подтвердить что ты не робот

Как выполнить подзапрос Postgresql в предложении select со вступлением из предложения типа SQL Server?

Я пытаюсь написать следующий запрос в postgresql:

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

Это, безусловно, будет работать на Microsoft SQL Server, но это совсем не на postegresql. Я немного прочитал его документацию и, кажется, могу переписать его как:

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

Но это возвращает следующую ошибку в postegresql: "Подзапрос в FROM не может ссылаться на другие отношения одного и того же уровня запросов". Поэтому я застрял. Кто-нибудь знает, как я могу это достичь?

Спасибо

4b9b3361

Ответ 1

Я не уверен, что понимаю ваше намерение совершенно, но, возможно, следующее будет близко к тому, что вы хотите:

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)

К сожалению, это добавляет требование группировки первого подзапроса по id, а также имени и author_id, которые, как мне кажется, не нужны. Я не уверен, как обойти это, тем не менее, поскольку вам нужно иметь идентификатор, доступный для присоединения во втором подзапросе. Возможно, кто-то еще придумает лучшее решение.

Поделитесь и наслаждайтесь.

Ответ 2

Я просто отвечаю здесь с форматированной версией последнего sql файла, который мне нужен на основе ответа Боба Джарвиса, как указано в моем комментарии выше:

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)