按最大ID选择最大日期

时间:2016-07-31 11:49:48

标签: oracle date plsql max

我的查询看起来像这样:

var pf = null;
pf += Test.Print1;
pf += t.Print;

查询按其ID返回实体列表。 喜欢(它并不重要):

  

12001
  12004
  15003

除此之外,我还有包含3列的表:

序列 实体(来自上方) value_date(格式:dd / mm / yyyy) 所有实体的价值日期都不相同。

例如,表格如下:

with t as ( 
             ****** complex query from several joining tables  ***** 
          )
select * from t;

我需要为每个实体运行(来自查询,因为该表还为我保留了不相关的实体),并为实体选择max value_date的最大序列。 (换句话说,为每个实体找到max value_date,并在其中找到max seq)。

结果需要列出3列:seq,entity,value_date。 我该怎么办?

我希望我的问题很明确。

2 个答案:

答案 0 :(得分:1)

嗯。这是一种不需要聚合的方法:

with t as ( 
             ****** complex query from several joining tables  ***** 
      )
select t.*,
       (select max(t2.seq) keep (dense_rank first order by date desc)
        from t2
        where t2.entity = t.entity
       ) as max_seq
from t;

如果您还需要日期,则可以更轻松地获取日期:

select t.*,
       (select max(t2.seq) keep (dense_rank first order by t2.date desc)
        from t2
        where t2.entity = t.entity
       ) as max_seq,
       (select max(t2.date)
        from t2
        where t2.entity = t.entity
       ) as max_date
from t;

答案 1 :(得分:1)

您可能最好使用视图并加入此视图,尤其是如果您需要此逻辑(选择最高日期,每个实体的最高seq)不止一次。

create view (...viewname...) - SELECT部分​​如下:

select seq, entity, value_date 
from   (
          select seq, entity, value_date, 
                 row_number() over 
                            (partition by entity order by value_date desc, seq desc) as rn
          from   t2
       )
where  rn = 1;

然后:

with t as ( ... )
select t.*, v.seq, v.value_date
from   t inner join viewname v
         on t.entity = v.entity

通过重新阅读您的帖子,您真正需要的只是视图定义的select部分 - 以您需要的任何方式使用它。

当你说value_date格式为dd / mm / yyyy时,我不确定 - 这似乎意味着它是VARCHAR2或其他类似的字符串格式,而不是实际日期。在这种情况下,最好的选择是修复数据结构并使其成为日期数据类型。否则,您需要使用to_date(value_date, 'dd/mm/yyyy')而不是value_date