Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как работает having? / 6 сообщений из 6, страница 1 из 1
24.03.2017, 13:16
    #39426504
milvic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает having?
Доброго времени суток.

есть такой запрос:
Код: 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
24.03.2017, 14:01
    #39426530
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает having?
Во-первых, исходные строки по группам вы разбиваете условием group by "Name1", "Name2". То есть, по уникальной комбинации двух полей. Таким образом две приведенные вами строки принадлежат двум разным группам. Причем в каждой группе оказывается по единственной строке.

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

В-третьих, можно указывать аргумент функции count отличный от *. Но нужно понимать, что это стоит делать лишь для того, чтобы подсчитать количество (общее, не уникальных) значений аргумента, не являющихся NULL.
...
Рейтинг: 0 / 0
24.03.2017, 14:25
    #39426555
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает having?
для 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
24.03.2017, 14:47
    #39426565
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает having?
Код: 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
24.03.2017, 15:13
    #39426588
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает having?
LeXa NalBat,

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


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