首先,具体的要求,会给你一个更好的答案。碰巧我在开发一个程序时遇到了这个问题,该程序使用 3 种不同的伪分组方法(在寻找替代方法时),并且 ALL 3 可用于回答您的问题,具体取决于您需要做什么。我相信还有更多的方法可以做到这一点。
例如,您可以通过简单地选择 max( your_field ) 并按某些字段分组来提取组内的最大值,如果这就是您所需要的。
select bname, nation, max( date_from ) from adrp group by bname, nation. "selects highest "from" date for each bname
如果您需要在查询中使用该最大值作为过滤条件,您可以通过使用子查询和max
在子查询中执行伪分组来做到这一点(注意我如何将 BNAME 检查移到子查询中,其中意味着我不必使用in (subquery)
加法检查这两个字段):
select ... from adrp as b_adrp "Pulls the latest person info for a user (some conditions are missing, but this is a part of an actual query)
where b_adrp~date_from in (
select max( date_from ) "Highest date_from where both dates are valid
from adrp where persnumber = b_adrp~persnumber and nation = b_adrp~nation and date_from <= @sy-datum )
上面的查询允许您选择从基本查询中选择所有用户信息,并且(第一个查询只允许获取聚合和分组数据)。
最后,如果您需要基于复合键进行检查并将其与多个聚合函数结果进行比较,那么实现将在很大程度上取决于您的要求的具体情况(并且由于您的问题没有,我将提供一个通用的)。最简单的选择是以完全相同的方式使用exists
/not exists
而不是并形成子查询以检查特定键或条件的存在而不是拉列表(如果必须,您可以嵌套子查询):in (subquery)
select * from bkpf where exists ( select 1 from bkpf as b where belnr = bkpf~belnr and gjahr = bkpf~gjahr group by belnr, gjahr having max( budat ) = bkpf~budat ) "Took an available example, that I had in testing program.
所有 3 个查询都将为您提供组内列的最大值,事实上,所有 3 个查询都可以使用连接来获得相同的结果。