簡體   English   中英

SQL 連接 3 個表並獲取最新購買日期

[英]SQL Join 3 tables and get latest purchase date

我試圖找到客戶最后一次購買的確切日期。

我有一個包含客戶信息的表。 我有另一個表格列出了他們在 6 個月內進行的購買,還有另一個表格列出了他們在 6 個月內進行的購買。

  1. 顧客
|customer_id|fname|lname | | 1 |John |Doe | | 2 |Pete |Jones | | 3 |Jane |Evans | | 4 |Alan |Malcom | | 5 |Ron |Ray |
  1. 購買歷史(6個月內購買)
 |customer_id|product_id|purchase_date | | 1 |00001 |2018-02-01 11:35:14| | 1 |00002 |2018-03-02 12:25:23| | 3 |00003 |2018-04-03 13:15:34| | 1 |00001 |2018-05-04 14:45:45| | 3 |00002 |2018-06-05 15:55:24| | 2 |00001 |2018-07-01 16:05:41|
  1. PurchaseHistoryArchive(購買時間超過 6 個月)
 |customer_id|product_id|purchase_date | | 1 |00001 |2017-02-01 11:35:14| | 1 |00002 |2017-03-02 12:25:23| | 3 |00003 |2017-04-03 13:15:34| | 4 |00001 |2017-05-04 14:45:45| | 3 |00002 |2017-06-05 15:55:24| | 5 |00001 |2017-07-01 16:05:41|

理想情況下,我想要的結果應該是這樣的:

 |customer_id|fname|lname |purchase_date | | 1 |John |Doe |2018-05-04 14:45:45| | 2 |Pete |Jones |2018-07-01 16:05:41| | 3 |Jane |Evans |2018-06-05 15:55:24| | 4 |Alan |Malcom |2017-05-04 14:45:45| | 5 |Ron |Ray |2017-07-01 16:05:41|

或者,如果這是不可能的,那么可能是這樣的:

 |customer_id|fname|lname |purchase_date_new |purchase_date_old | | 1 |John |Doe |2018-05-04 14:45:45|2017-05-04 14:45:45| | 2 |Pete |Jones |2018-07-01 16:05:41|2017-03-02 12:25:23| | 3 |Jane |Evans |2018-06-05 15:55:24|2017-06-05 15:55:24| | 4 |Alan |Malcom |NULL |2017-05-04 14:45:45| | 5 |Ron |Ray |NULL |2017-07-01 16:05:41|

我可以使用以下代碼分別針對客戶表查詢 PurchaseHistory 和 PurchaseHistoryArchive 表,但理想情況下我想在一個查詢中完成。

SELECT c.customer_id, c.fname, c.lname, p1.purchase_date, p2.purchase_date
FROM customers c
LEFT JOIN purchaseHistory p1 ON (c.customer_id, = p1.customer_id)
LEFT OUTER JOIN purchaseHistory p2 ON (c.customer_id = p2.customer_id AND 
    (p1.purchase_date < p2.purchase_date OR p1.purchase_date = p2.purchase_date AND p1.customer_id < p2.customer_id))
WHERE p2.customer_id IS NULL
ORDER BY customer_id desc;

請問有什么想法嗎??

您可以在join之前進行聚合:

select c.*,
       coalesce(ph.max_pd, pha.max_id) as max_purchase_date
from customers c left join
     (select ph.customer_id, max(ph.purchase_date) as max_pd
      from PurchaseHistory ph
      group by ph.customer_id
     ) ph
     on c.customer_id = ph.customer_id left join
     (select pha.customer_id, max(pha.purchase_date) as max_pd
      from PurchaseHistory pha
      group by pha.customer_id
     ) pha
     on c.customer_id = pha.customer_id;

你可以像下面這樣寫,你不需要從存檔表中獲取所有行。

  select p.customer_id, max(p.purchase_date) as last_purchase
  from PurchaseHistory p
  inner join customer c on c.customer_id=p.customer_id
  group by p.customer_id
  union all
  select p.customer_id, max(p.purchase_date) as last_purchase
  from PurchaseHistoryArchive p
  inner join customer c on c.customer_id=p.customer_id
  where not exists(select 1 from PurchaseHistory where customer_id=c.customer_id)
  group by p.customer_id
SELECT C.*, JQ.purchaseDate FROM CUSTOMERS C 
        OUTER APPLY 
            (SELECT TOP 1 U.purchaseDate FROM (SELECT PH1.purchaseDate 
                                                    FROM PurchasHistory PH1 
                                                    WHERE PH1.Customer_id = C.CustomerId
                                                UNION ALL 
                                                SELECT PH2.purchaseDate 
                                                    FROM PurchasHistoryArchive PH2 
                                                    WHERE PH2.Customer_id = C.CustomerId) U
                                                ORDER BY U.purchaseDate DESC            
            ) JQ                                                        

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM