【问题标题】:select by max id into max date按最大 id 选择到最大日期
【发布时间】:2016-07-31 11:49:47
【问题描述】:

我有一个如下所示的查询:

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

查询通过其 ID 返回一个实体列表。 喜欢(没关系):

12001
12004
15003

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

序列 实体(从上面) value_date(格式:dd/mm/yyyy) 所有实体的起息日都不相同。

例如,表格如下所示:

seq           entity        value_date 
----------    ----------    ----------  
1580          12001         31/05/2016 
1579          12001         30/06/2016 
1578          15003         30/06/2016 
1577          12001         30/06/2016 
1576          15003         30/06/2016 
1575          15003         30/06/2016 
1574          12004         30/06/2016
1573          15003         31/05/2016 
1572          12004         31/05/2016 
1571          67677         30/04/2016 

我需要为每个实体运行(来自查询,因为该表也包含与我无关的实体),并为实体选择具有最大值 value_date 的最大序列。 (换句话说,为每个实体找到最大值 value_date,并在其中找到最大序列)。

结果需要是 3 列的列表:seq、entity、value_date。 我该怎么做?

我希望我的问题很清楚。

【问题讨论】:

    标签: oracle date plsql max


    【解决方案1】:

    如果你需要这个逻辑(为每个实体选择最高日期、最高序列)不止一次,你可能会更好地使用一个视图并加入这个视图。

    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

    【讨论】:

    • 也许……我会考虑的。
    • value_date 是日期格式。 (value_date 只是列的名称)
    【解决方案2】:

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

    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;
    

    【讨论】:

      猜你喜欢
      • 2022-01-03
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 2020-11-16
      相关资源
      最近更新 更多