raw_data:
名称 | account_id | 类型元素_id成本 | |
---|---|---|---|
第一个 | 1 | 类型1元素10.1 | |
第二个 | 2 | 类型2元素20.2 | |
第一个 | 11 | 类型2 | 元素11 | 0.11
我认为可以这样做的一种方法是:
SELECT *
FROM
(
SELECT rd.name, rd.account_id, rd.type, rd.element_id, rd.cost raw_cost, c.account_id component_account_id, c.type component_type, c.element_id component_element_id, c.cost component_cost,
row_number() OVER (PARTITION BY rd.name, rd.account_id, rd.type, rd.element_id
ORDER BY
CASE WHEN c.account_id <> -1 THEN 1 END
+ CASE WHEN c.type IS NOT NULL THEN 1 END
+ CASE WHEN c.element_id IS NOT NULL THEN 1 END DESC) rd
FROM raw_data rd LEFT OUTER JOIN components c
ON rd.name = c.name
AND (rd.account_id = c.account_id or c.account_id = -1)
AND (rd.type = c.type OR c.type IS NULL)
AND (rd.element_id = c.element_id OR c.element_id IS NULL)
) iq
WHERE rd = 1
这里的想法是在实际匹配或默认匹配上进行匹配。然后,row_number
窗口函数用于根据实际匹配的列数对匹配进行优先级排序(您说过不关心平局,所以这无法处理(。外部查询丢弃不是最好的匹配项。
对于上面的示例数据,这可能是一个inner join
,但我将其保留为left join
,因为上面提到了这一点。
这是一把小提琴。希望这接近你想要的。
如果表中记录的比率不是1比1,则无法生成明确的样本。此外,如果选择条件是"否";至少一个参数的一致性";,那么做出明确的选择也将不起作用。
下面是一个能让你更接近解决问题的例子。它选择与其中一个选择条件匹配的数据,但可能存在重复!
尝试此变体并报告结果,可能是在样本和记录的较大变体上
也许这会让你更接近解决方案。
select rd.name, rd.account_id, rd.type, rd.element_id, rd.cost, c.cost
from raw_data rd
left join components c on rd.name = c.name
where (c.account_id = rd.account_id or c.account_id = -1) OR
(c.type = rd.type OR c.type is null) OR
(c.element_id = rd.element_id OR c.element_id = null)
您可以通过联合建立检查值的优先级
select rd.name, rd.account_id, rd.type, rd.element_id, rd.cost, c.cost
from raw_data rd
left join components c on rd.name = c.name
where c.account_id = rd.account_id and
c.type = rd.type
c.element_id = rd.element_id
union
select rd.name, rd.account_id, rd.type, rd.element_id, rd.cost, c.cost
from raw_data rd
left join components c on rd.name = c.name
where c.account_id = rd.account_id and
c.type = rd.type
union
select rd.name, rd.account_id, rd.type, rd.element_id, rd.cost, c.cost
from raw_data rd
join components c on rd.name = c.name
where c.account_id = rd.account_id
etc
如果没有看到所有的问题,表格中的所有数据选项,很难给出正确的解决方案,这可能不是…