我們有以下情況在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