powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос на уникальные значения
16 сообщений из 16, страница 1 из 1
Запрос на уникальные значения
    #39286914
azsx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица
id | s3 | num
0 | ааа | 1
1 | ббб | 1

2 | ввв | 1
3 | ааа | 2
4 | ббб | 2

5 | ддд | 2
6 | ааа | 3
7 | иии | 3
8 | ббб | 4
9 | ппп | 4
Мне надо выбрать поле num, только тех записей num, в которых поле s3 равно "ааа" и "ббб" одновременно. То есть 1 и 2 num. Не могу понять как это сделать.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
CREATE TABLE t_test
(
  id bigserial PRIMARY KEY,
  s3 character(3),
  num bigint
);

INSERT INTO public.t_test(s3, num) VALUES ('ааа', 1);
INSERT INTO public.t_test(s3, num) VALUES ('ббб', 1);
INSERT INTO public.t_test(s3, num) VALUES ('ввв', 1);
INSERT INTO public.t_test(s3, num) VALUES ('ааа', 2);
INSERT INTO public.t_test(s3, num) VALUES ('ббб', 2);
INSERT INTO public.t_test(s3, num) VALUES ('ддд', 2);
INSERT INTO public.t_test(s3, num) VALUES ('ааа', 3);
INSERT INTO public.t_test(s3, num) VALUES ('иии', 3);
INSERT INTO public.t_test(s3, num) VALUES ('ббб', 4);
INSERT INTO public.t_test(s3, num) VALUES ('ппп', 4);
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39286939
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azsxтех записей numЕсли нужны именно numы, то group by. Если все строки с такими numами, то partition by
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39286971
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
select * from t_test as a join t_test as b on a.s3='ааа' and b.s3='ббб' and a.num=b.num;
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39286992
azsx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо. То есть верно будет
Код: plsql
1.
select * from t_test as a join t_test as b on a.s3='ааа' and b.s3='ббб' and a.num=b.num;


так как вторая выборка используется как служебная для первой? То есть b используется для выборки a?
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39286995
azsx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извините, скопировал не то, а править не умею.
Код: plsql
1.
select a.num from t_test as a join t_test as b on a.s3='ааа' and b.s3='ббб' and a.num=b.num;
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39287395
azsx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в итоге в group by ничего не получается. С join также всё плохо, так как я не понимаю сути запроса, я не могу, например, добавить третье условие для выборки 'ввв', к примеру.
Дайте ссылок на русском чего почитать по теме таких запросов, пожалуйста? Всё что сам нашел по group by мне не подходит совсем, что нашел по join - ваще темный лес.
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39287400
Alexius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azsx,

почитайте про having, count(distinct xx) и будет тогда с group by работать.
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39288835
azsx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к сожалению так и не добился. Читал, никак не понял как к моему запросу это приспособить этот group by.
Зато прочитал (читаю книжку последовательно) решение с массивами.
Насколько хорошо будет решение с массивами если у меня сегодня 3 миллиона записей в каждой по 2000 тысячи элементов в среднем?
Правильно ли я понял, что ограничений на размер массива нет?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  CREATE TABLE public.test3
(
  id_s3 bigserial PRIMARY KEY,
  text_s3 character(3)[],
  id_ind bigint
);

INSERT INTO public.test3(s3[1], s3[2], s3[3], num) VALUES ('ааа', 'ббб', 'ввв', 1);
INSERT INTO public.test3(s3[1], s3[2], s3[3], num) VALUES ('ааа', 'ббб', 'ддд', 2);
INSERT INTO public.test3(s3[1], s3[2], num) VALUES ('ааа', 'иии', 3);
INSERT INTO public.test3(s3[1], s3[2], num) VALUES ('ббб', 'ппп', 4);



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT id_s3, s3, num
  FROM public.test3 where 'ааа' = ANY (s3) AND 'ббб' = ANY (s3);
1;"{ааа,ббб,ввв}";1
2;"{ааа,ббб,ддд}";2

LECT id_s3, s3, num
  FROM public.test3 where 'ааа' = ANY (s3) AND 'ббб' = ANY (s3) AND 'ввв' = ANY (s3);
1;"{ааа,ббб,ввв}";1
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39288837
azsx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
извините, не то скопировал
Код: plsql
1.
2.
3.
4.
5.
6.
  CREATE TABLE public.test3
(
  id_s3 bigserial PRIMARY KEY,
  s3 character(3)[],
  num bigint
);
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39289026
azsx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допинали. Теперь вопрос, какой запрос лучше.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT num, COUNT(num)
FROM public.t_test where s3 IN ('ааа', 'ббб') GROUP BY num HAVING COUNT(num) > 1; 
1;2
2;2
 
SELECT num, COUNT(num)
FROM public.t_test where s3 IN ('ааа', 'ббб', 'ввв') GROUP BY num HAVING COUNT(num) > 2; 
1;3
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39289095
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сколько людей столько и решений=)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t(s3, num) as (
VALUES ('ааа', 1),
('ббб', 1),
('ввв', 1),
('ааа', 2),
('ббб', 2),
('ддд', 2),
('ааа', 3),
('иии', 3),
('ббб', 4),
('ппп', 4))
select t.num from t join lateral (select from t as a where a.num=t.num and a.s3='ааа' limit 1) a on true
join lateral (select from t as b where b.num=t.num and b.s3='ббб' limit 1) b on true
group by t.num
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39289127
azsx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только у вас еще больше запросов, это совсем похоронит базу при многих запросах. Напомню, у меня (пересчитал) 6 млн записей num и в среднем на каждом 2000 записей s3. 3*10(6) * 2*10(3) = 6(9) в идеале :)
вот мне их лучше в массив или по отдельности?
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39289137
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azsx, если вы считаете что у вас много записей то count лучше обходить стороной. это слабое место в postgres.

и в таком случае ваши способы не сработают:
0 | ааа | 1

2 | aaa | 1
3 | ббб | 2
4 | ббб | 2

5 | ддд | 2
6 | ааа | 3
7 | иии | 3
8 | ббб | 4
9 | ппп | 4
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39289151
azsx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторесли вы считаете что у вас много записей то count лучше обходить стороной. это слабое место в postgres.
спасибо, не знал. То есть вариантов нет - надо делать массив?
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39289174
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
azsx,

Для изначально поставленной задачи я бы ещё так попробовал:
Код: sql
1.
2.
3.
SELECT num FROM t_test a
 WHERE s3='ааа'
   AND EXISTS (SELECT FROM t_test b WHERE b.num=a.num AND b.s3='ббб');


Что будет лучше — нужно смотреть по планам.
...
Рейтинг: 0 / 0
Запрос на уникальные значения
    #39289238
Фотография Legushka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vyegorov, точно)
я сразу не догадался
перепишу на свой лад, но для плана наверное одинаково
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t(s3, num) as (
VALUES ('ааа', 1),
('ббб', 1),
('ввв', 1),
('ааа', 2),
('ббб', 2),
('ддд', 2),
('ааа', 3),
('иии', 3),
('ббб', 4),
('ппп', 4))
select t.num from t join lateral join lateral (select from t as b where b.num=t.num and b.s3='ббб' limit 1) b on true
where  t.s3='aaa' 
group by t.num
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос на уникальные значения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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