2011-06-02 72 views
0

我在甲骨文9G兩個非常簡單的表:援助聯接查詢

客戶

userid | firstName | lastName | email 
-------+-----------+----------+--------------------- 
    1  user1  User1  [email protected] 
    2  user2  User2  [email protected] 

訂購

orderiD | userId | OrderType | Order_Date | Amount 
--------+--------+-----------+------------+------- 
1   1   0   12/12/2009 1 
2   1   1   13/12/2009 2 
3   1   1   14/12/2009 3 
4   2   0   12/12/2009 4 
5   2   1   16/12/2009 2 
6   1   0   14/12/2009 5 
7   2   1   17/12/2009 4 
8   2   0   10/12/2010 2 

我要選擇具有所有用戶訂單類型0

select *  
from Customer c 
inner join Order o on c.userid = o.userid 
where o.orderType = '0' 

結果是:

orderiD | userId | OrderType | Order_Date | Amount 
--------+--------+-----------+------------+-------- 
1   1   0   12/12/2009 1 
4   2   0   12/12/2009 4 
6   1   0   14/12/2009 5 
8   2   0   10/12/2010 2 

現在我需要修改這個查詢,使只有最後一次購買日期爲每個用戶ID和得到的結果是這樣的:

orderiD | userId | OrderType | Order_Date | Amount 
--------+--------+-----------+------------+-------- 
6   1   0   14/12/2009 5 
8   2   0   10/12/2010 2 

我應該如何修改我的查詢來獲得這個結果?

回答

3
SELECT * 
FROM order o 
WHERE o.orderType ='0' 
    AND o.order_date = 
     (SELECT MAX(o2.order_date) 
     FROM order o2 
     WHERE o2.userid = o.userid 
      AND o2.orderType = '0' 
    ) 

SELECT o.* 
FROM order o 
    JOIN 
    (SELECT userid 
      , MAX(order_date) AS lastPurchaseDate 
     FROM order 
     WHERE o.orderType ='0' 
     GROUP BY userid 
    ) AS grp 
    ON grp.userid = o.userid 
    AND grp.lastPurchaseDate = o.order_date 
-1
SELECT * 
FROM Order o 
INNER JOIN 
(SELECT MAX(o.id) AS maxid 
FROM Customer c 
INNER JOIN Order o ON c.userid = o.userid 
WHERE o.orderType ='0' 
GROUP BY c.userid) x ON x.maxid = o.id 
+0

這是怎麼得到的最大日期? – DOK 2011-06-02 09:12:26

+1

從某種意義上說,解決方案是一種作弊/快捷方式,因爲它假定o.id將按日期排序(很可能是真的)。但是你可以想象一個情況,其中order_date被改變,在這種情況下,這個SQL不太正確。 – tofutim 2011-06-02 09:19:25

+0

這在很多方面都是錯誤的。 @danny:請在'9,2,0,14,12/2009,9'的表格中添加一行,並再次運行查詢以查明原因。 – 2011-06-02 10:01:56

1

試試這個:需要

select * 
from customer c 
,  order o 
where c.userid = o.userid 
and o.orderType ='0' 
and o.order_date = (
    select max(o2.order_date) 
    from order o2 
    where o2.userid = o.userid 
) 
0

無子查詢,只是聚合函數。

select c.userId, o.OrderType, 
     max(o.Order_Date), 
     max(o.orderiD) keep (dense_rank last order by order_date), 
     max(o.Amount) keep (dense_rank last order by order_date) 
from Customer c inner join Order o 
on c.userid = o.userid where o.orderType ='0' 
group by c.userId, o.OrderType