Я пытаюсь записать следующий запрос на 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: "подзапрос в ОТ не может относиться до других отношений того же уровня запроса". Таким образом, я застреваю. Кто-либо знает, как я могу достигнуть этого?
Спасибо
Я не уверен, что полностью понимаю ваше намерение, но, возможно, следующее было бы близко к тому, что вы хотите:
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, а также по name и author_id, что, как мне кажется, было нежелательно. Однако я не уверен, как это можно обойти, поскольку вам нужно иметь id, чтобы присоединиться ко второму подзапросу. Возможно, кто-то другой предложит лучшее решение.
Делитесь и наслаждайтесь.
Я просто отвечаю здесь с форматированной версией окончательного 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)