在 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)
- 但根据您的特定问题尚不清楚 - 所以我在解决您问题的重点左连接问题时,我将其留给您
我有两张表,一张是销售信息,一张是发货信息。两者都在每个订单的项目级别。换句话说,即使订单中有多个商品,两个表中的每条记录也只会有 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)
- 但根据您的特定问题尚不清楚 - 所以我在解决您问题的重点左连接问题时,我将其留给您