问题描述
我目前正在MS Access中运行查询,但是使用sql而不是“设计窗口”来运行。我仍在学习,因此将不胜感激。
我拥有下表(我已对此进行了颜色编码以帮助您):
我希望实质上对除CAP_REFERENCE之外的所有字段执行“分组依据”语句,但仅返回一组共享相同CAP_REFERENCE值的唯一值(我在这些示例表中对此分组进行了颜色编码)。
目前,我可以运行以下“ Group By”语句来删除所有字段重复组合的记录。 注意:我知道使用group by function我必须max()(或类似的方法)我的CAP_REFERENCE,所以如果有多个,它只会取第一个可能的值。
SELECT FACULTY_CODE,UNIT_CODE,CLASS_CODE,CAPACITY,LOCATION,NEW,max(CAP_REFERENCE)
FROM tbl
GROUP BY FACULTY_CODE,NEW
然后我获取:
我是否可以对这两行进行“分组依据”,以便结果表将改为以下内容? (我真正需要的是):
我曾经考虑过可能将CAP_REFERENCE相同的行串联起来,然后将它们全部放在一个新表中,然后执行“ Group By”操作,但是那时我不知道如何再次将所有值分开。我正在运行该查询的完整表具有509条记录,因此我绝对需要对流程进行标准化。
我感谢所有想法!
在这里编辑原始表,因此您不必键入它:)
+------+------+-------+-------+---------+------+--------+
| col1 | col2 | col3 | col4 | col5 | col6 | col7 |
+------+------+-------+-------+---------+------+--------+
| 550 | 0 | ALERT | FULL | OUTSIDE | NO | ABC123 |
| 550 | 1 | ALERT | EMPTY | OUTSIDE | NO | ABC123 |
| 550 | 0 | ALERT | FULL | OUTSIDE | NO | ABC456 |
| 550 | 1 | EVENT | EMPTY | OUTSIDE | NO | ABC456 |
| 553 | 0 | ALERT | FULL | OUTSIDE | NO | ABC555 |
| 553 | 1 | EVENT | EMPTY | OUTSIDE | NO | ABC555 |
| 553 | 0 | ALERT | FULL | OUTSIDE | NO | ABC888 |
| 553 | 1 | EVENT | EMPTY | OUTSIDE | NO | ABC888 |
+------+------+-------+-------+---------+------+--------+
编辑 修复了示例数据中的拼写错误,抱歉!
解决方法
您似乎想过滤掉两行“较早出现”的上限参考值对,也就是说,在所有其他行中都有重复项。
如果此解释正确,则可以使用聚合获取上限参考:
select t.CAP_REFERENCE
from tbl as t
where exists (select 1
from tbl as t2
where t2.FACULTY_CODE = t.FACULTY_CODE and
. . . and -- all the other conditions
t2.CAP_REFERENCE < t.CAP_REFERENCE
)
group by t.cap_reference
having count(*) = 2;
这就是您不想要的参考。因此,您可以使用left join
:
select t.*
from tbl as t left join
(select t.CAP_REFERENCE
from tbl as t
where exists (select 1
from tbl as t2
where t2.FACULTY_CODE = t.FACULTY_CODE and
. . . and -- all the other conditions
t2.CAP_REFERENCE < t.CAP_REFERENCE
)
group by t.cap_reference
having count(*) = 2
) as tt
on tt.CAP_REFERENCE = t.CAP_REFERENCE
where tt.CAP_REFERENCE is null;