我在下表中的列名称为Item
,Point
和IsCorrect
。
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
我要使用分区,而不是分组。非常感谢您的帮助。
答案 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
的值进行比较。