Oracle SQL 分组依据,使用最新日期的值

Oracle SQL Group By, use value from latest date

基本上,我希望计算匹配的 "group by" 记录,其中字段中的最新值对于该组而言等于请求的值。

所以,例如,假设我有:

A, B, 2, 1/1/2015
E, F, 9, 12/1/2014
A, B, 6, 1/15/2015
E, F, 4, 1/8/2015
A, B, 4, 1/10/2015
C, D, 4, 2/4/2015
A, B, 4, 2/1/2015
C, D, 22, 2/16/2015

我正在查找 "Field1/2 grouped" 条记录的计数,其中该组的字段 3 的最新值为“4”。我希望结果是:

4: for group "A, B"
2: for group "E, F"

组 "C, D" 根本不会出现在我的结果中。

希望这有点道理。

我的确切问题比这个稍微复杂一些...但是,我认为这会让我克服很大的障碍。

with selected as (
    select field1, field2
    from some_table
     where field3 = 4
      and (field1, field2, field4) in (
        select field1, field2, max(field4)
        from some_table
        group by field1, field2
    )
)
select field1, field2, count(*)
from some_table join selected using(field1, field2)
group by field1, field2

使用 (field1, field2, field4)field3 上的索引,这会根据 SQL Fiddle.

高效执行

更短更优雅,为了完整起见,我包括了这个替代方案。如果有大量行,此解决方案也可能更有效,因为它在建议的索引就位时避免任何 table 扫描。

子查询分解子句包括两个解析函数,一个是统计每组的行数,另一个是识别最新的记录。这些在外部查询中用作过滤器。管道是 Oracle 的串联运算符,并根据您的要求格式化输出。

with cte as ( select t23.*
                     , count(*) over (partition by grp1, grp2) as grp_cnt
                     , row_number() over (partition by grp1, grp2 order by ts desc) as latest
              from t23 )
select  
       grp_cnt || 
       ': for group "' ||
       grp1 || ',' || grp2 ||
       '"'
from cte
where latest = 1
and val = 4
/

Working SQL Fiddle here.

解析函数非常简洁,因为它们允许我们在纯粹的 SQL 中做一些非常强大的事情。 Find out more.