DB2: Получить последний заказ для каждого клиента в данной таблице?

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

таким образом, запрос вернет всех клиентов в таблице Customer и информацию о последнем заказе (скажем, order_id), размещенном клиентом (у клиента может быть много заказов). Есть какие-нибудь идеи по поводу того, как это сделать?

В таблице "Заказ" есть столбец с отметкой времени, когда было размещен заказ.

Что-то вроде этого:

SELECT customer.name, order.order_id
FROM customer, order
WHERE customer.customer_id=order.customer_id
AND order.ordertime is newest 

Большое спасибо.

ОБНОВЛЕНИЕ: просто чтобы прояснить мой вопрос, я бы хотел, чтобы для каждого клиента возвращалась отдельная строка с информацией о последнем заказе (отдельном заказе) для этого клиента.

4 ответа

Первая группа по клиенту и выберите максимальную дату заказа:

select   customer_id, max(ordertime)
from     order
group by customer_id

Вы не можете получить все остальные поля с помощью запроса так просто. Теперь вам нужно снова присоединить эти результаты к таблице заказов, чтобы получить то, что вы хотите.

select  c.name, o.*
from    customer c join 
        order o on c.customer_id = o.customer_id join
(
    select   customer_id, max(ordertime) ordertime
    from     order
    group by customer_id
) RecentOrders on o.customer_id = RecentOrders.customer_id and 
                  o.ordertime = RecentOrders.ordertime

Попробуй это:

SELECT Customer1.Name, Order1.order_id
    FROM Customer Customer1, Order Order1 
    WHERE Customer1.customer_id = Order1.customer_id 
    AND Order1.LASTUPDATETIME = (
        SELECT MAX(Order2.LASTUPDATETIME)
            FROM Order Order2 
            WHERE Order2.customer_id=Order1.customer_id
        )

Попробуй это. Это работает в MySQL, не уверен насчет синтаксических различий между MySQL и DB2:(

select c.name, s.* from (
    select o1.customer_id, o1.order_id from order o1
    left join order o2
    on o1.customer_id = o2.customer_id and o1.ordertime < o2.ordertime
    where o2.customer_id is null
) as S
join customers c on c.customer_id = s.customer_id

Может быть решен с помощью соединения. Customer_id является первичным ключом в таблице клиентов и используется в таблице заказов для распознавания клиента, который размещает заказ. Дата - это столбец, в котором указана дата размещения заказа (если бы вы могли предоставить структуру таблицы, я мог бы написать правильный запрос для вашей структуры).

SELECT customer_id,order_id
FROM (
Select o.customer_id,o.order_id,max(o.order_date)
FROM Customer c
inner join Orders o
ON o.customer_id=c.customer_id
GROUP BY o.customer_id,o.order_id
 )
Другие вопросы по тегам