从GROUP BY子句中排除参与字段

时间:2014-03-20 03:30:43

标签: sql oracle aggregate-functions

在Oracle DB中,我需要进行查询以获取某个列的MAX(),同时在SELECT语句中还有另一个字段。即。

PRIMARY_KEY_ID | FIELD_A | FIELD_B
---------------------------------------
123            | AFB     | 01-JAN-2002
123            | AFB     | 02-FEB-2002
123            | AFB     | 03-MAY-2002
123            | COB     | 15-JAN-2003
123            | COB     | 18-DEC-2004

运行以下查询将导致:

SELECT
  field_a,
  MAX(field_b)
FROM table_a
GROUP BY primary_key_id, field_a
HAVING primary_key_id = 123;


FIELD_A | FIELD_B
----------------------
AFB     | 03-MAY-2002
COB     | 18-DEC-2004

我的意图是只返回一行:FIELD_B的最新日期,在本例中为 18-DEC-2004 。但是,由于一对(* PRIMARY_KEY_ID *,* FIELD_A *)将返回两行(因为PRIMARY_KEY_ID是唯一的但FIELD_A不是),所以结果集不会返回所需的行。

2 个答案:

答案 0 :(得分:1)

您需要在primary_key_id组中找到最大值,然后使用field_b过滤掉结果,该结果等于组内的最大值。希望它有所帮助

select field_a, field_b
  from (select field_a,
               field_b,
               max(field_b) over (partition by primary_key_id) as max_b
          from table_a)
 where primary_key_id=123
   and field_b = max_b;

答案 1 :(得分:0)

您可以尝试使用以下查询

         SELECT
         field_a,
         MAX(field_b) over (partition by primary_key_id) 
         FROM table_a
         where primary_key_id=123;

希望它有助于

Vishad