2011-06-02 59 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