SQL-返回列匹配最多的行
考虑下表:SQL-返回列匹配最多的行,sql,oracle,Sql,Oracle,考虑下表: Name Color1 Color2 Color3 Prize ----------------------------------------- Bob Red Blue Green Stapler Bob Red Blue NA Pencil Bob Red NA NA Lamp Bob Red NA NA
Name Color1 Color2 Color3 Prize
-----------------------------------------
Bob Red Blue Green Stapler
Bob Red Blue NA Pencil
Bob Red NA NA Lamp
Bob Red NA NA Chair
Bob NA NA NA Mouse Pad
鲍勃有三种颜色。这就是我想要得到的:
(#1) If Bob has Red, Blue, Green (match 3) .... Return Stapler
(#2) If Bob has Red, Blue, Purple (match 2) ... Return Pencil
(#3) If Bob has Red, Orange, Purple (match 1) . Return Lamp AND Chair rows
(#4) If Bob has Brown, Pink, Black (match 0) .. Return Mouse Pad
颜色只会出现在它们自己的列中。因此,在上面的示例中,红色将仅出现在Color1列中,而不会出现在Color2或Color3中。黑色将只使用Color3,而不会使用Color1或Color2。等等
我只想要匹配最多的行
我真的不希望使用4个单独的SELECT语句来执行此操作,并且每次检查它们是否返回一行。我在存储过程中就是这样做的,它很笨重
如何在1 SQL语句中执行此操作?使用Oracle如果这很重要
谢谢 您可以使用
case
计算匹配项,然后获取包含最多匹配项的行。在Oracle中,这将使用几个子查询:
select name
from (select t.*
from (select t.*,
((case when color1 in ('Red', 'Blue', 'Green') then 1 else 0 end) +
(case when color2 in ('Red', 'Blue', 'Green') then 1 else 0 end) +
(case when color3 in ('Red', 'Blue', 'Green') then 1 else 0 end) +
) as numMatches
from table t
) t
order by nummatches desc
) t
where rownum = 1;
我只想要匹配最多的行
您可以使用函数rank()进行以下操作:
这将返回匹配最多的一行或多行
select name, color1, color2, color3, prize
from (
select t.*, rank() over (order by decode(color1, 'Red', 1, 0)
+ decode(color2, 'Blue', 1, 0) + decode(color3, 'Green', 1, 0) desc) rnk
from t)
where rnk = 1