Как найти первую и последнюю дату до определенной даты в Postgresql? - PullRequest
2 голосов
/ 18 июня 2019

Я новичок в SQL. У меня проблемы с поиском ответа на этот вопрос

Для каждого customer_id, который сделал заказ 1 января 2006 г., какие были их исторические (до 1 января 2006 г.) даты первого и последнего заказа?

Я пытался решить это с помощью подзапроса. Но я не знаю, как найти даты первого и последнего заказа до 1 января.

Столбцы таблицы A:

customer_id            
order_id              
order_date   
revenue  
product_id

Столбцы таблицы B:

product_id  
category_id
SELECT customer_id, order_date FROM A
(
     SELECT customer_id FROM A
     WHERE order_date = ‘2006-01-01’
)
WHERE ...

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

На самом деле есть два подзапроса.Первый для " Для каждого customer_id, который сделал заказ 1 января 2006 года ", а второй для " их исторические (до 1 января 2006 года) даты первого и последнего заказа "

Итак, во-первых:

select customer_id from A where order_date = '2006-01-01';

и во-вторых:

select customer_id, min(order_date) as first_date, max(order_date) as last_date
from A
where order_date < '2006-01-01' group by customer_id;

Наконец, вам нужно получить только тех клиентов из второго подзапроса, которые существуют в первом:

select customer_id, min(order_date) as first_date, max(order_date) as last_date
from A as t1
where 
    order_date < '2006-01-01' and
    customer_id in (
        select customer_id from A where order_date = '2006-01-01')
group by customer_id;

или, может быть более эффективным:

select customer_id, min(order_date) as first_date, max(order_date) as last_date
from A as t1
where 
    order_date < '2006-01-01' and
    exists (
        select 1 from A as t2
        where t1.customer_id = t2.customer_id and t2.order_date = '2006-01-01')
group by customer_id;
0 голосов
/ 18 июня 2019

Вы можете использовать условные выражения в агрегатных функциях:

SELECT customer_id, MIN(order_date) AS first, MAX(order_date) AS last FROM A 
WHERE customer_id IN (SELECT customer_id FROM A WHERE order_date = ‘2006-01-01’) AND order_date < '2006-01-01'
GROUP BY customer_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...