2016-01-21 71 views
-2

我们有以下情况在Oracle中查询。按组排序

我们有订单和交易,订单被映射到多个交易。

Order 
orderId|customer|..... 

Transaction 
orderId|transactionId|transactionDate|..... 

我们需要显示每个订单的最新交易。我如何在Oracle 11g中使用它?

+0

我担心的是,按照您的其他问题,您似乎已经获得了很好的答案,并且您已经忽略了它们。我已经低估了**和**投票结束(容易过于宽泛,因为您没有展示任何先前的努力)。 – halfer

回答

0

这是一个方法

select t1.* from transactions t1 inner join 
(
select orderId,max(transactiondate) as transactiondate from transactions 
group by orderId 
) t2 on o.orderId=t.orderId and t1.transactiondate =t2.transactiondate 
0

您可以将窗聚合函数找到最后一行:

select ... 
from 
(
    select ..., 
     row_number() 
     over (partition by orderId 
      order by transactionDate desc) as rn 
    from ... 
) dt 
where rn = 1 
0

刚刚测试这一个OK:

SELECT * 
FROM orders o 
INNER JOIN transactions t1 
ON t1.orderId = o.orderId 
WHERE NOT EXISTS 
    (SELECT 1 
    FROM transactions t2 
    WHERE t2.orderId  = t1.orderId 
    AND t2.transactionDate>t1.transactionDate 
); 
0

有多种方法可以实现这一点。正如上面已经显示的那样,使用DENSE_RANK和ROW_NUMBER之类的分析函数可以是一种方法。但坦率地说,使用分析函数来做这样的基本事情似乎有点矫枉过正。

请参阅下面的内容以更简单的方式完成此操作。请注意,如果'Order'表中需要的列是orderId,那么在'Order'表后加入'Transaction'表并不是必须的,因为在'Transaction'表中也可以使用。我故意将表保存在连接中,只是因为如果有必要从'Order'中获取更多列(也可以使用此查询完成),只需在选择列表中添加这些列,从而使查询变得灵活从两个表中获取数据。

SELECT ord.orderId, tran.* 
FROM Order ord, Transaction tran 
(SELECT orderId, MAX(transactionDate) mtransactionDate 
FROM Transaction 
GROUP BY orderId) maxtran 
WHERE ord.orderId = tran.orderId 
AND tran.transactionDate = maxtran.mtransactionDate 
AND tran.orderId = maxtran.orderId