DB2: Получить последний заказ для каждого клиента в данной таблице? - PullRequest
1 голос
/ 20 февраля 2012

У меня есть таблицы Customer и Order в 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 ]

2 голосов
/ 20 февраля 2012

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

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
0 голосов
/ 20 февраля 2012

Попробуйте:

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
        )
0 голосов
/ 20 февраля 2012

Попробуй это. Это работает в 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
0 голосов
/ 20 февраля 2012

можно решить с помощью соединения 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
 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...