我需要一些关于 SQL 查询的帮助。
我有一个表格,其格式和数据如下所示:
id | applicant_id | application_status | status_time
1 | 1234 | received | 2013-05-06 15:00:00
1 | 1234 | pending | 2013-05-06 15:30:00
1 | 1234 | approved | 2013-05-06 16:00:00
我需要解决的问题必须打印以下内容:
applicant_id | initial_status | initial_time | current_status | current_status_time
1234 | received | 2013-05-06 15:00:00 | approved | 2013-05-06 16:00:00
我怎样才能完成这样的事情,最好只使用联接而不使用嵌套选择?
最佳答案
一般来说,解决此问题的最佳方法是使用 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;
关于mysql - SQL 查询 - 打印同一行中一个表的最小值和最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16407715/