只选择有效期较晚的行

时间:2011-08-04 21:32:59

标签: mysql select

如果我有一个像下面这样的表,我怎么才能选择那些serial_number及其contract_type以及更晚的到期日期?

serial_number      contract_type         expiry_date
abc001                  SPRT              2011-05-31 00:00:00
abc001                  HOMD              2013-05-31 00:00:00
abc002                  SPRT              2012-10-14 00:00:00
abc002                  HOMD              2011-10-14 00:00:00
abc003                  SPRT              2014-05-31 00:00:00
abc003                  HOMD              2011-05-31 00:00:00
................

1)如果它使这个查询更简单,我可以做出假设:每个serial_number(SN)在表中只有两个且只有两个contract_types。

2)实际情况是:SN和contract_type是主键,我只是在寻找contract_type'SPRT'和'HOMD'。

我需要的最终结果集是:

  • SN只有'SPRT'或'HOMD'contract_type

  • 如果SN同时具有'SPRT'和'HOMD',我只需要SN的记录以及更晚的到期日期(如果它们具有相同的到期日期,只选择一个)

任何人都可以发出查询?实际案例可能过于复杂而无法进入一个查询,但第一个简化案例如何。

1 个答案:

答案 0 :(得分:1)

SELECT t.serial_number, t.contract_type, t.expiry_date
    FROM YourTable t
        INNER JOIN (SELECT serial_number, MAX(expiry_date) AS MaxDate
                        FROM YourTable
                        WHERE contract_type IN ('SPRT', 'HOMD')
                        GROUP BY serial_number) q
            ON t.serial_number = q.serial_number
                AND t.expiry_date = q.MaxDate
    WHERE t.contract_type IN ('SPRT', 'HOMD')