Как выполнить подзапрос 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 не может ссылаться на другие отношения одного и того же уровня запросов". Поэтому я застрял. Кто-нибудь знает, как я могу это достичь?
Спасибо
Ответы
Ответ 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)