加入查询需要帮助

问题描述 投票:0回答:4

我在Oracle 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

我应该如何修改我的查询以获得此结果?

sql oracle plsql
4个回答
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   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

-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
© www.soinside.com 2019 - 2024. All rights reserved.