![](/img/trans.png)
[英]SQL query to join two tables and get latest data based on ApprovedByLevel
[英]SQL Join 3 tables and get latest purchase date
我試圖找到客戶最后一次購買的確切日期。
我有一個包含客戶信息的表。 我有另一個表格列出了他們在 6 個月內進行的購買,還有另一個表格列出了他們在 6 個月內進行的購買。
|customer_id|fname|lname | | 1 |John |Doe | | 2 |Pete |Jones | | 3 |Jane |Evans | | 4 |Alan |Malcom | | 5 |Ron |Ray |
|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|
|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.