在虚拟行组中获取max(date)行

时间:2017-08-16 20:41:01

标签: sql oracle greatest-n-per-group

假设我有这个数据的表:

System  CompDate  Type
A1      Jan-1     T1
A1      Jan-2     T2 
A1      Jan-3     T3
A2      Jan-4     T2
B1      Feb-1     T1
B2      Feb-2     T1
B2      Feb-3     T2

我希望按类型,最大日期不是针对每个系统,而是针对每组系统。 所有的A都被视为一个组,我想将所有的A视为A1和B作为一个组,B1。

所以我的结果是:

 A1    Jan-1  T1
 A1    Jan-4  T2
 A1    Jan-3  T3
 B1    Feb-2  T1
 B1    Feb-3  T2

我知道我可以按系统做最大日期:

 SELECT System, CompDate,Type
 FROM TableName T1
 WHERE  CompDate = (SELECT max(compdate) from tablename T2  
                    WHERE T2.type=T1.type
                    AND T2.System=T1.System ) 

但是如何对所有As和B进行分组?在As的值中没有已知的模式,所以也可能是我有系统= M,N,P并且我需要将该集合视为一个组,可能使用标题M.没有表已经定义了“组”系统代码。我只知道数据库外部的分组。

2 个答案:

答案 0 :(得分:0)

这是你想要的吗?

select min(system), max(compdate), type
from t
group by (case when system in ('A1', 'A2') then 'A'
               when system in ('B1', 'B2') then 'B'
               else system
          end), type;

或者,您可以将其标记为:

select (case when system in ('A1', 'A2') then 'A'
             when system in ('B1', 'B2') then 'B'
             else system
        end),
       max(compdate), type
from t
group by (case when system in ('A1', 'A2') then 'A'
               when system in ('B1', 'B2') then 'B'
               else system
          end), type;

答案 1 :(得分:0)

假设您的系统字段值有2个字符:

SELECT system,
       compdate,
       type
  FROM (SELECT LEFT(system, 1) + '1' system,
               compdate,
               type,
               ROW_NUMBER() OVER (PARTITION BY LEFT(system, 1) + '1', type ORDER BY compdate DESC) rownum
          FROM tablename --your table
       ) a
 WHERE rownum = 1

结果

system  compdate    type
A1      2017-01-01  T1
A1      2017-01-04  T2
A1      2017-01-03  T3
B1      2017-02-02  T1
B1      2017-02-03  T2