我们有以下情况在Oracle中查询。按组排序
我们有订单和交易,订单被映射到多个交易。
Order
orderId|customer|.....
Transaction
orderId|transactionId|transactionDate|.....
我们需要显示每个订单的最新交易。我如何在Oracle 11g中使用它?
我们有以下情况在Oracle中查询。按组排序
我们有订单和交易,订单被映射到多个交易。
Order
orderId|customer|.....
Transaction
orderId|transactionId|transactionDate|.....
我们需要显示每个订单的最新交易。我如何在Oracle 11g中使用它?
这是一个方法
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
您可以将窗聚合函数找到最后一行:
select ...
from
(
select ...,
row_number()
over (partition by orderId
order by transactionDate desc) as rn
from ...
) dt
where rn = 1
刚刚测试这一个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
);
有多种方法可以实现这一点。正如上面已经显示的那样,使用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
我担心的是,按照您的其他问题,您似乎已经获得了很好的答案,并且您已经忽略了它们。我已经低估了**和**投票结束(容易过于宽泛,因为您没有展示任何先前的努力)。 – halfer