Oracle - 使用min函数和group by进行额外的列检查

时间:2012-02-24 00:18:31

标签: oracle

我的Oracle表格包含以下列:message_id,status,status_date

我想返回message_id,当按message_id分组时,status_date的mininum值的记录在status列中的值为'PC'。 换句话说,如果按mess_id分组时返回的最小值为status_date的记录在状态列中没有值'PC',则不返回记录。

谢谢,

布赖恩

1 个答案:

答案 0 :(得分:0)

我猜这是源数据的样子:

message_id status status_date
---------- ------ -----------
         1 PC     01-JAN-12
         1 QC     02-JAN-12
         1 RC     03-JAN-12
         2 AA     04-JAN-12
         2 PC     05-JAN-12
         2 CC     06-JAN-12
         3 PC     07-JAN-12
         3 PC     08-JAN-12
         3 PC     09-JAN-12

预期的输出将是这样的:

message_id
----------
         1 
         3 

返回这两个记录的原因是因为对于message_id=1的所有记录,具有最小status_date的记录的值为01-JAN-12。 message_id=1和status_date为01-JAN-12的记录的状态为“PC”,与message_id=3类似。由于status_date的记录的最小message_id=2为04-JAN-12,因此状态不是'PC'。

我们可以使用内联视图构建此查询,但使用分析函数可能更简单。

SELECT A.MESSAGE_ID
FROM   MY_TABLE A, 
       (  SELECT B.MESSAGE_ID, MIN(B.STATUS_DATE) MIN_DATE
          FROM MY_TABLE B
          GROUP BY B.MESSAGE_ID ) C
WHERE  A.STATUS = 'PC' 
AND    A.STATUS_DATE = C.STATUS_DATE 
AND    A.MESSAGE_ID = C.MESSAGE_ID;