[英]Left Join on ROW_NUMBER() OVER (PARTITION
我有兩張表,一張是銷售信息,另一張是運輸信息。 兩者都在每個訂單的項目級別。 換句話說,即使訂單中有多個項目,兩個表中的每條記錄的數量也只有 1。
表格1
訂單號 | 產品代碼 | 成本 | 貨幣 |
---|---|---|---|
100 | 啊 | 10 美元 | 美元 |
100 | 啊 | 10 美元 | 美元 |
101 | bb | 15 美元 | 美元 |
表 2
訂單號 | 產品代碼 | 運營商服務 | 裝運成本 |
---|---|---|---|
100 | 啊 | 承運人 A | 7 美元 |
100 | 啊 | 承運人 B | 7 美元 |
101 | bb | 載體 C | 13 美元 |
我需要加入表格以便從每個表格中提取方面。 挑戰在於每條記錄都沒有唯一的標識符。 我最初嘗試在 order_number 和 product_code 上加入這兩個表,但這導致結果重復(因為缺乏唯一性)。
然后我嘗試添加 ROW_NUMBER() OVER (PARTITION... 以分配行號並嘗試將該條件添加到連接中,但我仍然失敗。第二個 CTE 的值沒有拉到最終結果,但如果你要單獨運行它,值會填充。
WITH ss AS (
SELECT
ROW_NUMBER() OVER (PARTITION BY product_code) AS row_id,
order_number,
product_code,
cost,
currency,
FROM sales
ORDER BY order_number, product_code, ROW_NUMBER() OVER (PARTITION BY product_code)),
sis AS (
SELECT
ROW_NUMBER() OVER (PARTITION BY product_code) AS row_id,
order_number,
product_code,
carrier_service,
shipment_cost
FROM items
GROUP BY 1,2,3,4,5,6
ORDER BY order_number, product_code, ROW_NUMBER() OVER (PARTITION BY product_code))
Select
ss.order_number,
ss.product_code,
ss.cost
ss.currency,
sis.carrier_service,
sis.shipment_cost,
FROM ss
LEFT JOIN sis
ON ss.order_number=sis.order_number AND ss.product_code=sis.product_code and ss.row_id=sis.row_id
ORDER BY ss.order_number, ss.product_code
期望的結果
訂單號 | 產品代碼 | 成本 | 貨幣 | 運營商服務 | 裝運成本 |
---|---|---|---|---|---|
100 | 啊 | 10 美元 | 美元 | 承運人 A | 7 美元 |
100 | 啊 | 10 美元 | 美元 | 承運人 B | 7 美元 |
101 | bb | 15 美元 | 美元 | 載體 C | 13 美元 |
實際結果
訂單號 | 產品代碼 | 成本 | 貨幣 | 運營商服務 | 裝運成本 |
---|---|---|---|---|---|
100 | 啊 | 10 美元 | 美元 | Null | Null |
100 | 啊 | 10 美元 | 美元 | Null | Null |
101 | bb | 15 美元 | 美元 | Null | Null |
我無法加入行號嗎? 或者有沒有更好的方法來解決這個問題?
考慮下面
select order_number, product_code, cost, currency, carrier_service, shipment_cost
from (select *, row_number() over(partition by product_code) rn from table1) t1
left join (select *, row_number() over(partition by product_code) rn from table2) t2
using(order_number, product_code, rn)
order by order_number, product_code
如果應用於您問題中的示例數據 - output 是
請注意:即使我在您的代碼中使用over(partition by product_code)
- 我覺得它應該是over(partition by order_number)
- 但根據您的特定問題尚不清楚 - 所以我要離開它在解決作為您問題重點的左連接問題時由您決定
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.