【问题标题】:Multiple max values in a query查询中的多个最大值
【发布时间】:2010-12-13 00:39:58
【问题描述】:

我知道标题听起来不是很具有描述性,但这是我能想到的最好的:

我有这张桌子

ID BDATE 值 28911 2009 年 14 月 4 日 44820 28911 2009 年 4 月 17 日 32240 28911 2009 年 4 月 20 日 30550 28911 22/4/2009 4422587,5 28911 2009 年 4 月 23 日 4441659 28911 24/4/2009 7749594,67 38537 2009 年 4 月 17 日 58280 38537 2009 年 4 月 20 日 137240 38537 22/4/2009 81098692 38605 2009 年 14 月 4 日 2722368 38605 20/4/2009 5600 38605 22/4/2009 1625400 38605 2009 年 4 月 23 日 6936575

这实际上是一个非常复杂的查询,封装在一个视图中,但现在不重要了。

我想为每个 ID 设置包含最高 BDate 的行。在此示例中,这将是结果。

ID BDATE 值 28911 24/4/2009 7749594,67 38537 22/4/2009 81098692 38605 2009 年 4 月 23 日 6936575

我已经试过了

select id, max(bdate), value from myview group by id, value

但它会返回所有行,因为每个值的列都是不同的。此查询是在 Oracle v10 中设计的,我只能使用选择查询而不是创建过程。

【问题讨论】:

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


    【解决方案1】:

    我们可以在 IN 子句中使用乘列:

    select id, bdate, value 
    from myview 
    where (id, bdate) in
        (select id, max(bdate)
         from myview group by id)
    /
    

    【讨论】:

    • 如何向该查询添加另一个条件 - 例如“AND 值 > 500”?
    【解决方案2】:

    您可以使用MAX...KEEP(DENSE_RANK FIRST...) 构造:

    SQL> SELECT ID,
      2         MAX(bdate) bdate,
      3         MAX(VALUE) KEEP(DENSE_RANK FIRST ORDER BY bdate DESC) VALUE 
      4   FROM DATA
      5  GROUP BY ID;
    
            ID BDATE            VALUE
    ---------- ----------- ----------
         28911 24/04/2009  7749594,67
         38537 22/04/2009    81098692
         38605 23/04/2009     6936575
    

    这将与Majkel 建议的分析方法一样有效(无自联接,单次传递数据)

    【讨论】:

      【解决方案3】:

      您可以使用 INNER JOIN 仅过滤掉最大行数:

      select t.*
      from YourTable t
      inner join (
           select id, max(bdate) as maxbdate
           from YourTable
           group by id
      ) filter
          on t.id = filter.id
          and t.bdate = filter.maxbdate
      

      打印出来:

      id     bdate       value
      38605  2009-04-23  6936575
      38537  2009-04-22  81098692
      28911  2009-04-24  7749594.67
      

      请注意,这将为具有相同 bdate 的多个值的 id 返回多行。

      【讨论】:

        【解决方案4】:

        您可以使用分析:

        select 
              id, bdate, value 
            from
              (
                select
                  id, bdate, value, max( bdate ) over ( partition by id ) max_bdate
                from
                  myview
              )
            where
              bdate = max_bdate
        

        【讨论】:

          【解决方案5】:
          select a.* from myview a, (select id, max(bdate) from myview group by id) b
          where a.id = b.id and a.bdate = b.bdate
          

          【讨论】:

          • 它没有返回我想要的值列
          【解决方案6】:
          SELECT id, bdate, value FROM myview
           WHERE (id, bdate) IN (SELECT id, MAX(bdate) FROM myview GROUP BY id)
          

          (未经测试...我现在没有可用的 Oracle...)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-10-21
            • 1970-01-01
            • 2012-09-29
            • 1970-01-01
            • 2023-04-06
            • 1970-01-01
            • 1970-01-01
            • 2018-12-10
            相关资源
            最近更新 更多