2013-01-16 13 views
0

我需要按客戶和訂單表之間的1:N關係列出客戶表中的列,即第一個訂單的日期和最後一個的所有數據。我正在使用Oracle 10g。Oracle SQL中的最後一個訂單商品

如何最好的方式來做到這一點?

 
TABLE CUSTOMER 
--------------- 
id    NUMBER 
name   VARCHAR2(200) 
subscribe_date DATE 


TABLE ORDER 
--------------- 
id    NUMBER 
id_order  NUMBER 
purchase_date DATE 
purchase_value NUMBER 
+0

表格如何關聯? 'customer'中'id'的'id'表與'id'有關嗎? – Taryn

回答

0

我很困惑你的字段名稱,但我打算假設ORDER.ID是CUSTOMER表中的ID。

最早訂購日期很簡單。

select CUSTOMER.*, min(ORDER.purchase_date) 
from CUSTOMER 
    inner join ORDER on CUSTOMER.id = ORDER.id 
group by CUSTOMER.* 

要獲取最後的訂單數據,請再次將其連接到ORDER表。

select CUSTOMER.*, min(ORD_FIRST.purchase_date), ORD_LAST.* 
from CUSTOMER 
    inner join ORDER ORD_FIRST on CUSTOMER.id = ORD_FIRST.id 
    inner join ORDER ORD_LAST on CUSTOMER.id = ORD_LAST.id 
group by CUSTOMER.*, ORD_LAST.* 
having ORD_LAST.purchase_date = max(ORD_FIRST.purchase_date) 
1

這裏是這樣做,用row_number功能,一個連接的一種方式,並在聚集:

select c.*, 
     min(o.purchase_date) as FirstPurchaseDate, 
     min(case when seqnum = 1 then o.id_order end) as Last_IdOrder, 
     min(case when seqnum = 1 then o.purchase_date end) as Last_PurchaseDate, 
     min(case when seqnum = 1 then o.purchase_value end) as Last_PurchaseValue 
from Customer c join 
    (select o.*, 
      row_number() over (partition by o.id order by purchase_date desc) as seqnum 
     from orders o 
    ) o 
    on c.customer_id = o.order_id 
group by c.customer_id, c.name, c.subscribe_date 
1

這不是明顯的如何加入customer表到orders表(order是Oracle中的保留字,因此您的表格不能被命名爲order)。如果我們假設在ordersid_order加入到idcustomer

SELECT c.id customer_id, 
     c.name name, 
     c.subscribe_date, 
     o.first_purchase_date, 
     o.id last_order_id, 
     o.purchase_date last_order_purchase_date, 
     o.purchase_value last_order_purchase_value 
    FROM customer c 
     JOIN (SELECT o.*, 
        min(o.purchase_date) over (partition by id_order) first_purchase_date, 
        rank() over (partition by id_order order by purchase_date desc) rnk 
       FROM orders o) o ON (c.id = o.id_order) 
WHERE rnk = 1 
0

也許是這樣的假設在OrderID場實際上Customer ID是:

SELECT C.*, O1.*, O2.purchase_Date as FirstPurchaseDate 
FROM Customer C 
LEFT JOIN 
(
    SELECT Max(purchase_date) as pdate, id 
    FROM Orders 
    GROUP BY id 
) MaxPurchaseOrder 
    ON C.Id = MaxPurchaseOrder.Id 
LEFT JOIN Orders O1 
    ON MaxPurchaseOrder.pdate = O1.purchase_date 
    AND MaxPurchaseOrder.id = O1.id 
LEFT JOIN 
(
    SELECT Min(purchase_date) as pdate, id 
    FROM Orders 
    GROUP BY id 
) MinPurchaseOrder 
    ON C.Id = MinPurchaseOrder.Id 
LEFT JOIN Orders O2 
    ON MinPurchaseOrder.pdate = O2.purchase_date 
    AND MinPurchaseOrder.id = O2.id 

而且sql fiddle

相關問題