在 ROW_NUMBER() OVER (PARTITION

Left Join on ROW_NUMBER() OVER (PARTITION

我有两张表,一张是销售信息,一张是发货信息。两者都在每个订单的项目级别。换句话说,即使订单中有多个商品,两个表中的每条记录也只会有 1 个数量。

Table 1

order_number product_code cost currency
100 aa USD
100 aa USD
101 bb USD

Table 2

order_number product_code carrier_service shipment_cost
100 aa Carrier A
100 aa Carrier B
101 bb Carrier C

我需要加入表格以便从每个表格中提取方面。挑战在于每条记录都没有唯一的标识符。我最初尝试在 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

想要的结果

order_number product_code cost currency carrier_service shipment_cost
100 aa USD Carrier A
100 aa USD Carrier B
101 bb USD Carrier C

实际结果

order_number product_code cost currency carrier_service shipment_cost
100 aa USD Null Null
100 aa USD Null Null
101 bb USD 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     

如果应用于您问题中的示例数据 - 输出为

请注意:尽管我在您的代码中使用了 over(partition by product_code) - 我觉得它应该是 over(partition by order_number) - 但根据您的特定问题尚不清楚 - 所以我在解决您问题的重点左连接问题时,我将其留给您