接近最好的方法,一般是使用功能row_number()
。然而,這需要一個嵌套的選擇:
select t.applicant_id,
max(case when seqnum_asc = 1 then status end) as initial_status,
max(case when seqnum_asc = 1 then status_time end) as initial_time,
max(case when seqnum_desc = 1 then status end) as current_status,
max(case when seqnum_desc = 1 then status_time end) as current_time
from (select t.*,
row_number() over (partition by applicant_id order by status_time) as seqnum_asc,
row_number() over (partition by applicant_id order by status_time desc) as seqnum_desc
from t
) t
group by t.applicant_id;
如果你的數據庫不支持row_number()
,我會建議相關子查詢,以提高可讀性。但是這些也是嵌套的。這是在MySQL能夠滿足您需求的解決方案:
select t.applicant_id,
substring_index(group_concat(status) separator ',' order by status_time), ',', 1) as initial_status,
min(status_time) as initial_time,
substring_index(group_concat(status) separator ',' order by status_time desc), ',', 1) as current_status,
max(status_time) as current_time
from t
group by t.applicant_id;
您正在使用哪個數據庫服務器/版本? – imthepitts 2013-05-06 21:40:32
歡迎使用堆棧溢出。供應商的功能差異很大。因此,將*數據庫類型和版本包含* all *查詢問題是一個好主意。 – Leigh 2013-05-06 22:31:15
我正在運行5.5 MySQL服務器 – petrasadi 2013-05-07 16:49:03