#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)
.