7

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

我有这张桌子

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 中设计的,我只能使用选择查询而不是创建过程。

4

6 回答 6

13

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

select id, bdate, value 
from myview 
where (id, bdate) in
    (select id, max(bdate)
     from myview group by id)
/
于 2009-11-04T13:47:33.617 回答
13

您可以使用以下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建议的分析方法一样有效(无自连接,数据单次传递)

于 2009-11-04T13:56:13.713 回答
5

您可以使用 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 返回多行。

于 2009-11-04T13:51:10.927 回答
3

您可以使用分析:

select 
      id, bdate, value 
    from
      (
        select
          id, bdate, value, max( bdate ) over ( partition by id ) max_bdate
        from
          myview
      )
    where
      bdate = max_bdate
于 2009-11-04T13:45:28.120 回答
0
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
于 2009-11-04T13:44:44.940 回答
0
SELECT id, bdate, value FROM myview
 WHERE (id, bdate) IN (SELECT id, MAX(bdate) FROM myview GROUP BY id)

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

于 2009-11-04T13:45:06.867 回答