Фильтр по элементу внутри группы в PostgreSQL

#sql #postgresql

#sql #postgresql

Вопрос:

У меня есть этот набор данных:

 CREATE TABLE my_table 
(
    the_debt_id varchar(6) NOT NULL,
    the_debt_pay_id varchar(8) NOT NULL, 
    the_debt_due date NOT NULL, 
    the_debt_paid timestamp NOT NULL
)

INSERT INTO my_table
VALUES ('LMUS01', 'LMUS0100', '2020-03-02', '2020-03-01 06:59:32'),
       ('LMUS01', 'LMUS0101', '2020-04-02', '2020-04-01 06:29:53'),
       ('LMUS01', 'LMUS0102', '2020-05-02', '2020-04-01 02:28:41'),
       ('LMUS01', 'LMUS0103', '2020-06-02', '2020-05-18 11:17:20'),
       ('LMUS01', 'LMUS0104', '2020-07-02', '2020-05-18 11:07:01'),
       ('LMUS01', 'LMUS0105', '2020-08-02', '2020-08-02 11:22:04'), 
       ('LMUS02', 'LMUS0200', '2020-01-02', '2020-01-03 09:34:20'),
       ('LMUS02', 'LMUS0201', '2020-02-02', '2020-01-31 06:58:18'),
       ('LMUS02', 'LMUS0202', '2020-03-02', '2020-03-02 07:30:59')
  

Как я могу фильтровать по элементу (скажем, LMUS0103 и LMUS0202) внутри группы? Например, я хочу, чтобы все записи были равны или меньше максимального the_debt_due значения в группе, в которую попадает элемент. Группа — это комбинация the_debt_id и даты the_debt_paid . Это ожидаемый результат:

 the_debt_id    the_debt_pay_id    the_debt_due
LMUS01         LMUS0100           2020-03-02    ---> LMUS01amp;2020-03-01 group1
LMUS01         LMUS0101           2020-04-02    ---> LMUS01amp;2020-04-01 group2
LMUS01         LMUS0102           2020-05-02    ---> LMUS01amp;2020-04-01 group2
LMUS01         LMUS0103           2020-06-02    ---> LMUS01amp;2020-05-18 group3  
LMUS01         LMUS0104           2020-07-02    ---> LMUS01amp;2020-05-18 group3 max date of group
LMUS02         LMUS0200           2020-01-02    ---> LMUS02amp;2020-01-03 group1
LMUS02         LMUS0201           2020-02-02    ---> LMUS02amp;2020-01-31 group2
LMUS02         LMUS0202           2020-03-02    ---> LMUS02amp;2020-03-02 group3 max date of group    
  

Я должен сгруппировать по the_debt_id и the_debt_paid::date для the_debt_pay_id IN ('LMUS0103','LMUS0202') , но я не могу понять, как получить максимальное значение этой группы. Заранее спасибо за помощь.

Комментарии:

1. «Меньше или равно максимальному» описывает все не NULL значения.

2. Привет @Gordon Linoff, меньше или равно максимальному значению в группе, куда попадает элемент. Например, для LMUS0103 он принадлежит к группе 3, максимальный the_debt_due элемент в этой группе равен 2020-07-02, поэтому все элементы равны или меньше 2020-07-02, так что это исключает строку, в которой находится LMUS0105.