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
/
解析函数非常简洁,因为它们允许我们在纯粹的 SQL 中做一些非常强大的事情。 Find out more.
基本上,我希望计算匹配的 "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.
子查询分解子句包括两个解析函数,一个是统计每组的行数,另一个是识别最新的记录。这些在外部查询中用作过滤器。管道是 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.