Извлечение записей, которые находятся в диапазонах дат в PostgreSQL

#sql #postgresql #date

#sql #postgresql #Дата

Вопрос:

Для каждого клиента я пытаюсь извлечь записи, которые находятся в пределах 45 дней с момента получения самой последней submit_date .

 customer  submit_date   salary
      A   2019-12-31   10000
      B   2019-01-01   12000
      A   2017-11-02   11000
      A   2019-03-03   3000
      B   2019-03-04   5500
      C   2019-01-05   6750
      D   2019-02-06   12256
      E   2019-01-07   11345
      F   2019-01-08   12345
  

Ответ №1:

На помощь приходят оконные функции:

 SELECT customer, submit_date, salary
FROM (SELECT customer, submit_date, salary,
             max(submit_date) OVER (PARTITION BY customer) AS latest_date
      FROM thetable) AS q
WHERE submit_date >= latest_date - 45;
  

Ответ №2:

Я склонен попробовать:

 select t.*
from t
where t.submit_date >= (select max(t2.submit_date) - interval '45 day'
                        from t t2
                       );
  

Я думаю, что это может в значительной степени использовать индекс на (submit_date) .

Если вы хотите, чтобы это относилось к каждому клиенту, используйте предложение correlation:

 select t.*
from t
where t.submit_date >= (select max(t2.submit_date) - interval '45 day'
                        from t t2
                        where t2.customer = t.customer
                       );
  

Для этого требуется индекс на (customer, submit_date) .