给出下表,我如何编写一个查询,将每个类别和代码保留在其中,如果没有关于“ product from”的值的记录,则仅记录“ product from”为空的记录?
> Category | Code | Product From | Product To
> :--------|------|--------------|----------
> Sports | A | ProdA | ProdB
> Sports | A | NULL | ProdB
> Sports | A | ProdX | ProdB
> Sports | B | NULL | ProdB
> Sports | C | ProdC | ProdD
> Sports | C | NULL | ProdD
由于代码A的ProdB有两个“乘积来自”,因此应删除以“乘积来自”为NULL的行。对于代码C,情况相同,但是对于代码B,应保留ProdB,因为它没有“乘积源”。
预期结果:
> Category | Code | Product From | Product To
> :--------|------|--------------|----------
> Sports | A | ProdA | ProdB
> Sports | A | ProdX | ProdB
> Sports | B | NULL | ProdB
> Sports | C | ProdC | ProdD
答案 0 :(得分:0)
您可以在子查询中使用窗口函数来检查在具有相同code
的记录组中所有记录是否为空,并在外部查询中应用逻辑:
select category, code, product_from, product_to
from (
select
t.*
max(product_from) over(partition by code) max_product_from
from mytable t
) x
where
product_from is not null
or max_product_from is null
如果分区中的所有product_from
是null
,则窗口max
返回null
。
category | code | product_from | product_to :------- | :--- | :----------- | :--------- Sports | A | ProdA | ProdB Sports | B | null | ProdB Sports | C | ProdC | ProdD
答案 1 :(得分:0)
另一种选择是使用WITH TIES
。
示例
Select top 1 with ties *
From mytable
Order by row_number() over (Partition by Category,Code,Product_To Order by Product_From desc)
返回
Category Code Product_From Product_To
Sports A ProdA ProdB
Sports B NULL ProdB
Sports C ProdC ProdD