Oracle SQL Group By,使用最新日期的值

时间:2015-03-12 23:07:42

标签: sql oracle 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分组”记录的计数,其中该组的字段3的最新值是“4”。我希望结果如下:

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

组“C,D”根本不会显示在我的结果中。

希望这有点意义。

我的确切问题比这复杂得多......但是,我认为这会让我遇到很大障碍。

2 个答案:

答案 0 :(得分:2)

子查询分解子句包括两个分析函数,一个用于计算每个组的行数,另一个用于标识最新记录。这些在外部查询中用作过滤器。管道是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.

答案 1 :(得分:0)

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有效执行。

APC's solution with windowing functions更短更优雅,我包括完整性的替代方案。如果存在大量行,此解决方案也可能更有效,因为它可以避免在建议的索引到位时进行任何表扫描。