微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

按行分组,其中字段是给定值

如何解决按行分组,其中字段是给定值

我目前正在MS Access中运行查询,但是使用sql而不是“设计窗口”来运行。我仍在学习,因此将不胜感激。

拥有下表(我已对此进行了颜色编码以帮助您):

enter image description here

我希望实质上对除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

然后我获取

enter image description here

我是否可以对这两行进行“分组依据”,以便结果表将改为以下内容? (我真正需要的是):

enter image description here

我曾经考虑过可能将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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。