我的标题有点含糊不清,但我会在下面澄清一下。
我创建了一个带有几个连接的视图(A)。我试图用另一种观点(B)加入这种观点。两个视图都包含年份字段,公司ID,行业ID和a,我们称之为产品代码,其值为I或U.
视图B还包含员工ID,每个公司ID都有多个员工ID。任何员工ID都可以包含I,U或两者的产品代码。如果两者都有,那么将有2个相同的员工ID由产品代码排除。
现在我想加入关于年份,客户ID,行业ID和产品代码的视图A.但是,由于视图B中的每个客户ID都可能发生两次(如果该客户的基础员工同时拥有产品代码I和U),我只想加入一次。
这是产品代码的客户ID分布:
我和不是你:165'370
你不是我:45'27
你和我:48'920
left join [raw].[ViewA] a on a.year=b.year and a.CustomerID=b.CustomerID
and a.IndustryID=b.IndustryID and a.ProductCode ='I'
这是我目前正在运行的连接,虽然我排除了所有只有CustomerID只有产品代码U的记录。我之所以想要每个客户ID /年/ IndustryID只加入一次是因为我以后聚合View A中的其他一些值。因此,我不能让该值出现两次。
目前的结果
Year CustomerID IndustyID ProductCode Value
2015 A Z I 50
2015 A Z U NULL
2015 B Z I 40
2016 A Z I 20
2016 B Z U NULL
我想要什么
Year CustomerID IndustyID ProductCode Value
2015 A Z I 50
2015 A Z U NULL
2015 B Z I 40
2016 A Z I 20
2016 B Z U 30
如果我理解正确,请尝试以下内容
[伪]
left join ( Select *, rank() over (partition by whatMakesItUnique Order by ProductCode) distinction From tableA ) a
on your conditions + a.distinction = 1
如果whatCakesItUnique为ProductCode“I”有2行,或者只有一行,则为“U”分配数字1,然后加入此分配的数字
“whatMakesItUnique”可能是您的案例中的Year,CustomerID,IndustyID列。
我认为你可以通过外部申请做你想做的事:
outer apply
(select top (1) a.*
from [raw].[ViewA] a
where a.year = b.year and a.CustomerID = b.CustomerID and
a.IndustryID = b.IndustryID
order by (case a.ProductCode when 'I' then 1 when 'U' then 2 else 3 end)
) a
这将从ViewA
返回一行,按产品代码排列优先顺序。