如果我有一个像下面这样的表,我怎么才能选择那些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的记录以及更晚的到期日期(如果它们具有相同的到期日期,只选择一个)
任何人都可以发出查询?实际案例可能过于复杂而无法进入一个查询,但第一个简化案例如何。
答案 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')