Как рассчитывать на DISTINCT ON без подзапроса

#sql #postgresql

#sql #postgresql

Вопрос:

Я пытаюсь реализовать подкачку, при которой он получает последний профиль с определенным электронным письмом, которое не было проверено. Я не понимаю, почему этот запрос завершается с ошибкой

столбец «profile.email» должен отображаться в предложении GROUP BY или использоваться в агрегатной функции

 select distinct ON (email) email, count(*) 
from "profile" where "verified" = false 
order by "email" asc, "created_date" asc limit 1
 

но это работает

 select distinct ON (email) email, * 
from "profile" where "verified" = false 
order by "email" asc, "created_date" asc limit 10
 

Есть ли у меня какой-нибудь способ решить эту проблему без использования подзапросов?

Редактировать

После некоторого тестирования данный ответ не представляется правильным.

 select distinct ON (email) email, count(*) over()
from "profile" 
where "email" = 'example@test.com' 
order by "email" desc, "created_date" desc limit 1
 

возвращает (неверно)

[{email: ‘example@test.com ‘,количество:18 }]

 select distinct ON (email) email
from "profile" 
where "email" = 'example@test.com' 
order by "email" desc, "created_date" desc limit 10
 

возвращает (правильно)

[{email: ‘example@test.com ‘}]

Комментарии:

1. У меня нет решения. Данный ответ был неверным.

Ответ №1:

Вы можете использовать оконную функцию:

 select distinct ON (email) email, count(*) over ()
from "profile"
where "verified" = false 
order by "email" asc, "created_date" asc
limit 1
 

Для этого примера я не знаю, какое преимущество это имеет перед:

 select email, count(*) over ()
from "profile"
where "verified" = false 
order by "created_date" asc
limit 1
 

Комментарии:

1. Что касается вашего второго запроса. Будет ли это работать, если ограничение больше 1?

2. @als9xd . . . Нет, но это не тот вопрос, который вы задали.

3. Извините, я обновил его. Мне нужно большее ограничение для разбивки на страницы. Также я использую это в обобщенной функции, где иногда мне не нужно получать distinct on, и подойдет обычный count() . Есть ли существенное влияние на производительность, если использовать это вместо all counts() , даже если они этого строго не требуют?

4. Я провел некоторое тестирование, и я думаю, что ваш запрос неверен. Я обновил свой вопрос результатами.