将一个值与组SQL Server中的其他值进行比较

时间:2019-11-15 21:05:00

标签: sql sql-server partitioning

我在下表中的列名称为ItemPointIsCorrect

Item | Point | IsCorrect | Not actual column, just logic 
-----+-------+-----------+--------------------
1    | 5     | 0         | 5 >= 6 
1    | 8     | 0         | 8 >= 6 
1    | 9     | 0         | 9 >= 6 
1    | 6     | 1         | 6 >= 6 

2    | 8     | 0         | 8 >= 7 
2    | 7     | 1         | 7 >= 7 
2    | 8     | 0         | 8 >= 7 
2    | 9     | 0         | 9 >= 7 

3    | 2     | 0         | 2 >= 9 
3    | 5     | 0         | 5 >= 9 
3    | 8     | 0         | 8 >= 9 
3    | 9     | 1         | 9 >= 9 

我想首先按项目分组,得到一个IsCorrect = 1的Point值,将其与其他point值进行比较(如第4列所示)。如果组中的所有条件均匹配,则选择该项目。我期望得到以下结果。

Item | Point | IsCorrect
-----+-------+----------
2    | 8     | 0
2    | 7     | 1
2    | 8     | 0
2    | 9     | 0

我要使用分区,而不是分组。非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

想到窗口功能

select t.*
from (select t.*, 
             max(case when iscorrect = 1 then point end) over (partition by item) as point_correct,
             min(point) over (partition by item) as min_point
      from t
     ) t
where min_point >= point_correct;

您也可以使用子查询来执行此操作。像这样:

select t.*
from t
where t.item in (select t2.item
                 from t t2
                 group by t2.item
                 having min(t2.point) >= min(case when t2.iscorrect then point end)
                );

也就是说,对于每个项目,将最小值 point的值与“正确的” point的值进行比较。