powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT
12 сообщений из 12, страница 1 из 1
SELECT
    #39181500
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Подскажите, пожалуйста, как из таблицы tb2 вида :
[img=]
Получить селектом такие данные :
[img=]

т.е. нужно вернуть строки, у которых sts = TRUE и, при этом, значение id_tb1 такой строки
больше не встречалось со статусом sts = FALSE.

Спасибо.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE tb2
(
  id_tb2 serial NOT NULL,
  xy character varying(2) NOT NULL,
  txt character varying(10),
  sts boolean NOT NULL,
  id_tb1 integer NOT NULL,
  CONSTRAINT tb2_pkey PRIMARY KEY (id_tb2)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE tb2
  OWNER TO postgres;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
INSERT INTO tb2 (xy, txt, sts, id_tb1) VALUES 
('x', 'a1', FALSE, 211), 
('x', 'b2', FALSE, 211),
('x', 'c3', FALSE, 212),
('x', 'd4', FALSE, 212),
('x', 'e5', FALSE, 212),
('x', 'f6', TRUE, 210),
('x', 'g7', FALSE, 212),
('x', 'h8', FALSE, 212),
('x', 'aa', FALSE, 211),
('y', 'bb', TRUE, 210),
('x', 'cc', TRUE, 210),
('x', 'dd', FALSE, 213),
('x', 'ee', FALSE, 212),
('x', 'ff', FALSE, 213),
('x', 'gg', FALSE, 213),
('x', 'hh', FALSE, 213),
('x', 'ii', FALSE, 213),
('y', 'ga', TRUE, 213),
('y', 'ka', FALSE, 213),
('x', 'la', FALSE, 213),
('y', 'ma', TRUE, 213),
('y', 'na', TRUE, 214),
('x', 'oa', TRUE, 215),
('y', 'pa', FALSE, 216);


...
Рейтинг: 0 / 0
SELECT
    #39181504
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходная таблица :

[img=]
...
Рейтинг: 0 / 0
SELECT
    #39181519
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл уточнить, для группы строк, как например с id_tb1 = 210
нужно вывести последнюю, т.е. с максимальным id_tb2,
в моем примере он равен 11.
...
Рейтинг: 0 / 0
SELECT
    #39181571
Фотография Станислав Клевцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Wong,

Ваш вариант запроса имеется ?
...
Рейтинг: 0 / 0
SELECT
    #39181583
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав Клевцов,

Код: plsql
1.
2.
3.
SELECT a.id_tb2, a.txt, a.sts, a.id_tb1 
FROM tb2 a LEFT JOIN tb2 b ON (a.id_tb2 = b.id_tb2)
WHERE a.sts = TRUE;



но на реальных данных, по которым делал этот пример
такой мой запрос не дал правильных результатов;

где-то накосячил, сейчас смотрю ...
...
Рейтинг: 0 / 0
SELECT
    #39181593
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... min over ... is true
...
Рейтинг: 0 / 0
SELECT
    #39181653
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2., спасибо, но не осилил, Вы бы не могли привести пример кода.
...
Рейтинг: 0 / 0
SELECT
    #39181703
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Wong,

min напрямую с boolean не работет, посему, для вывода всех строк в группе:
... ( ... first_value(sts) over(partition by id_tb1 order by sts) ... ) ... is true
...
Рейтинг: 0 / 0
SELECT
    #39181706
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Станислав Клевцов, из попыток, которые так-же не дали результат :

Код: plsql
1.
SELECT a.id_tb2, a.xy, a.txt, a.sts, a.id_tb1 FROM tb2 a LEFT JOIN tb2 b ON (a.id_tb2 = b.id_tb2) WHERE a.sts is TRUE AND b.sts NOT IN (TRUE);
...
Рейтинг: 0 / 0
SELECT
    #39181738
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p2.Alex_Wong,

min напрямую с boolean не работет, посему, для вывода всех строк в группе:
... ( ... first_value(sts) over(partition by id_tb1 order by sts) ... ) ... is trueс тем же успехом
Код: sql
1.
2.
3.
4.
5.
...
min(ste::text)
...
GROUP BY tb1_id
HAVING min(ste::text) =TRUE:text



но для большой повторяемости tb1_id -- это не выход
...
Рейтинг: 0 / 0
SELECT
    #39181745
Author the new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Wong,

Код: sql
1.
2.
3.
4.
5.
6.
7.
select tb2.* from 
(
    select max(t1.id_tb2) as id_tb2
      from tb2 t1 
     where t1.sts and not exists(select * from tb2 t2 where t1.id_tb1=t2.id_tb1 and not t2.sts)
     group by t1.id_tb1
) as t, tb2 where t.id_tb2=tb2.id_tb2
...
Рейтинг: 0 / 0
SELECT
    #39181834
Alex_Wong
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Author the new one,

круто, спасибо, Ваш код работает как мне нужно.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / SELECT
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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