基本上,我希望计算匹配的“分组依据”记录,其中该组字段中的最新值等于请求的值。
所以,例如,假设我有:
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”根本不会显示在我的结果中。
希望这有点意义。
我的确切问题比这复杂得多......但是,我认为这会让我遇到很大障碍。
答案 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
/
分析函数非常简洁,因为它们允许我们在纯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更短更优雅,我包括完整性的替代方案。如果存在大量行,此解决方案也可能更有效,因为它可以避免在建议的索引到位时进行任何表扫描。