2016-01-21 108 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