按组过滤

时间:2016-01-21 06:50:22

标签: sql oracle11g

我们在Oracle中查询以下情况。

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

Order
orderId|customer|.....

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

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

4 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

您可以应用窗口聚合函数来查找最后一行:

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

答案 2 :(得分: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
  );

答案 3 :(得分: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