使用SQL选择与人员列表关联的最早付款

时间:2012-11-02 15:33:53

标签: sql database oracle

在Oracle数据库上遇到SQL查询问题(我认为是11G)。

我需要对两个表进行查询。第一个包含人的标识符。第二个包含付款(您可以将其视为工资),每个记录与具有外键的人相关联。

我需要做的是检索已知的人员名单(比如标识符1,2,5和10),最早的付款(根据付款日期)。

我首先做的是:

select id_person, MIN(payment_date) 
from payment where id_person in (1, 2, 5, 10)
group by id_person;

这会检索如下内容:

1   19940623
2   20100429
5   20100204
10  20100111

现在,我如何为每个人提供与最早付款相对应的'付款'表的完整记录?

我无法弄清楚这样做的方法......

答案必须在一个SQL查询中(我无法为每个人打电话,这很容易做到......)

3 个答案:

答案 0 :(得分:1)

尝试

 select * from payment p
 where id_person in (1, 2, 5, 10)
    And payment_date =
       (Select Min(payment_date)
        From payment
        Where id_person = p.id_person)

根据您的评论:如果支付表具有密钥(主键或唯一索引),则解决方案很简单。如果是这样,请说密钥在列paymentId上,然后是..

 select * from payment p
 where id_person in (1, 2, 5, 10)
    And paymentId =
       (Selcet paymentId From payment p2
        Where id_person = p.id_person
           And payment_date =
             (Select Min(payment_date)
              From payment
              Where id_person = p.id_person))

答案 1 :(得分:1)

怎么样

SELECT * FROM Payment INNER JOIN (
    SELECT id_person, MIN(payment_date) 
    FROM payment p 
    WHERE id_person IN (1, 2, 5, 10)
    GROUP BY id_person;
    )
    ON Payment.id_person = p.idPerson AND Payment.payment_date = p.payment_date

答案 2 :(得分:1)

这应该这样做。

select *
from (
   select id_person, 
          payment_date,
          row_number() over (partition by id_person order by payment_date) as rn
   from payment
   where id_person ind (1,2,5,10)
) t
where rn = 1