Как я могу получить строки до некоторого условия для нескольких групп идентификаторов - PullRequest
0 голосов
/ 13 марта 2020

Как я могу получить строки до некоторого условия для нескольких групп

Пожалуйста, смотрите ниже my_table в настоящее время примененный порядок по (1) fk_user_id в порядке возрастания (2) create_date в порядке убывания

Я используя postgresql и пружинную загрузку jpa, jpql.

1) Найдите запрос для создания таблицы и вставьте данные, как показано ниже

Создание и вставка операторов:

CREATE TABLE public.my_table
(
  id bigint,
  condition boolean,
  fk_user_id bigint,
  created_date date
)
WITH (
  OIDS=FALSE
);
ALTER TABLE public.my_table
  OWNER TO postgres;

INSERT INTO public.my_table(
            id, condition, fk_user_id, created_date)
    VALUES 
    (137, FALSE, 23, '2019-08-28'),
    (107, FALSE, 23, '2019-05-13'),
    (83, TRUE, 23, '2019-04-28'),
    (78, FALSE, 23, '2019-04-07'),
    (67, TRUE, 23, '2019-03-18'),
    (32, FALSE, 23, '2019-01-19'),
    (181, FALSE, 57, '2019-11-04'),
    (158, TRUE, 57, '2019-09-27'),
    (146, FALSE, 57, '2019-09-16'),
    (125, FALSE, 57, '2019-07-24'),
    (378, TRUE, 71, '2020-02-16'),
    (228, TRUE, 71, '2019-12-13'),
    (179, FALSE, 71, '2019-10-06'),
    (130, FALSE, 71, '2019-08-19'),
    (114, TRUE, 71, '2019-06-29'),
    (593, FALSE, 92, '2020-03-02'),
    (320, FALSE, 92, '2020-01-30'),
    (187, FALSE, 92, '2019-11-23'),
    (180, TRUE, 92, '2019-10-17'),
    (124, FALSE, 92, '2019-08-05');

my_table

Я хотел бы получить все строки, которые имеют ВСЕ последнее условие ЛОЖЬ, до последней ИСТИНЫ, найденной , а затем пропустить другие строки для этого пользователя.

Например,

1) Идентификатор пользователя = 23 - первые 2 строки с идентификатором (137, 107) будут выбраны, как и в 2019-04-28, для них будет выполнено условие ИСТИНА, поэтому пропустить другие строки

2) Идентификатор пользователя = 57 - только 1 строка с идентификатором (181)

3) Идентификатор пользователя = 71 - Строки не будут выбраны, так как имеет последнее условие ИСТИНА

аналогично, мои строки результатов должны быть такими, как показано ниже.

enter image description here

Я могу найти строки только для 1 пользователь с запросом ниже

select * from user_condition where 
fk_user_id = 23 and created_date > (select max(created_date) from user_condition where fk_user_id = 23 and condition like 'TRUE' group by fk_user_id);

Но я хочу строки для всех fk_user_id

1 Ответ

1 голос
/ 13 марта 2020
SELECT t1.*
FROM sourcetable t1
WHERE t1.condition = 'FALSE'
  AND NOT EXISTS ( SELECT NULL
                   FROM sourcetable t2
                   WHERE t1.fk_user_id = t2.fk_user_id 
                     AND t1.created_date < t2.created_date /* or <= */
                     AND t2.condition = 'TRUE' )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...