匹配多列上的特定值或默认值



raw_data:

类型元素_id类型1元素1类型2元素20.11
名称 account_id成本
第一个 10.1
第二个 20.2
第一个 11 类型2 元素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

如果没有看到所有的问题,表格中的所有数据选项,很难给出正确的解决方案,这可能不是…

相关内容

  • 没有找到相关文章

最新更新