powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как работает having?
6 сообщений из 6, страница 1 из 1
Как работает having?
    #39426504
milvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

есть такой запрос:
Код: sql
1.
2.
3.
4.
5.
select "Name1", "Name2"
from public."Tab1" c2 
where upper(c2."Name1") = 'JEFFERSON'
group by "Name1", "Name2"
having count("Name1") = 1 



он возвращает что-то такое:
Name1 Name2
JEFFERSON JEFFERSON
JEFFERSON Джефферсон

Но в having же указано, что интересуют записи где count("Name1") = 1, а в ответе явно две записи с "Name1" = 'JEFFERSON' ..
что не так?
...
Рейтинг: 0 / 0
Как работает having?
    #39426530
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, исходные строки по группам вы разбиваете условием group by "Name1", "Name2". То есть, по уникальной комбинации двух полей. Таким образом две приведенные вами строки принадлежат двум разным группам. Причем в каждой группе оказывается по единственной строке.

Во-вторых, агрегатная функция агрегирует строки в каждой группе по отдельности.

В-третьих, можно указывать аргумент функции count отличный от *. Но нужно понимать, что это стоит делать лишь для того, чтобы подсчитать количество (общее, не уникальных) значений аргумента, не являющихся NULL.
...
Рейтинг: 0 / 0
Как работает having?
    #39426555
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для 10 лет стажа странный вопрос

having -- есть синтаксический сахар, и просто "уберегает" от "лишнего" селекта, в котором он обычное where
примерно так :
Код: sql
1.
2.
3.
4.
5.
SELECT  ... group by {list_gr} having having_aggr(...) = $val
-- это:
SELECT ...
FROM (SELECT  ... , having_aggr(..,) AS having_aggr group by {list_gr}  ) gr
WHERE having_aggr=$val



Код: sql
1.
2.
3.
4.
5.
select "Name1", "Name2"
from public."Tab1" c2 
where upper(c2."Name1") = 'JEFFERSON'
group by "Name1", "Name2"
having count("Name1") = 1 



вам нужно что--то типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select "Name1", Min("Name2") AS "Name2"
FROM (
select "Name1", "Name2"
from public."Tab1" c2 
where upper(c2."Name1") = 'JEFFERSON'
group by "Name1", "Name2"
)  AS c3
group by "Name1"
having count("Name1") = 1 
...
Рейтинг: 0 / 0
Как работает having?
    #39426565
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
select "Name1", min("Name2")
from public."Tab1"
where upper("Name1") = 'JEFFERSON'
group by "Name1"
having count(*) = 1
...
Рейтинг: 0 / 0
Как работает having?
    #39426588
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBat,

я исходил из того, что список вывода может быть шире листа группировки, приведённого в примере ТС. а формально -- всё так, но вопроса бы и не было.
...
Рейтинг: 0 / 0
Как работает having?
    #39429457
milvic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо.
Сделал, примерно, по рецепту от qwwq.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как работает having?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]