[英]How to use sub-queries in select clause with sub-queries in from clause
[英]How to fetch the max( latest_modified_time) records from resultsets of two sub-queries for each user using group by clause?
我有两个查询来获取记录列表。 我需要过滤这两个结果集,以便最终结果集包含每个用户的last_modified_time列的最大值。 怎么做 ?
查询1:
select us.user_id as user_id , us.modified_datetime as latest_modified_time , CONCAT(ui.first_name,' ',ui.last_name) as full_name
from lsa_user_skill us
left join lsa_user_info ui on us.modified_user_id= ui.user_id
where (us.user_id, us.modified_datetime ) IN
(select us.user_id, MAX(us.modified_datetime) from lsa_user_skill us group by us.user_id) ;
查询2:
select sal.affected_user_id as user_id, sal.modified_timestamp as latest_modified_time , CONCAT(info1.first_name,' ', info1.last_name) as full_name
from lsa_skill_auditlog sal
left join lsa_user_info info on info.user_id=sal.affected_user_id
left join lsa_user_info info1 on info1.user_id=sal.user_id
where sal.activity = 'User skill deleted';
如下所述,我尝试了UNION函数 ,该函数给出了这两个查询的结果集之和。 但是,没有得到如何按user_id分组以获取每个用户包含max(lates_modified_time)的记录的信息?
查询的尝试是:
select us.user_id as user_id , us.modified_datetime as latest_modified_time , CONCAT(ui.first_name,' ',ui.last_name) as full from lsa_user_skill us
left join lsa_user_info ui on us.modified_user_id= ui.user_id
where (us.user_id, us.modified_datetime ) IN
(select us.user_id, MAX(us.modified_datetime) from lsa_user_skill us group by us.user_id)
UNION
select sal.affected_user_id as user_id, sal.modified_timestamp as latest_modified_time , CONCAT(info1.first_name,' ', info1.last_name) as full from lsa_skill_auditlog sal
left join lsa_user_info info on info.user_id=sal.affected_user_id
left join lsa_user_info info1 on info1.user_id=sal.user_id
where sal.activity = 'User skill deleted'
您可以在以下位置使用union
和distinct on
:
select distinct on (user_id), x.*
from ((select us.user_id as user_id , us.modified_datetime as latest_modified_time , CONCAT(ui.first_name, ' ', ui.last_name) as full_name
from lsa_user_skill us left join
lsa_user_info ui
on us.modified_user_id = ui.user_id
) union all
(select sal.affected_user_id as user_id, sal.modified_timestamp as latest_modified_time, CONCAT(info1.first_name, ' ', info1.last_name) as full_name
from lsa_skill_auditlog sal left join
lsa_user_info info
on info.user_id = sal.affected_user_id left join
lsa_user_info info1
on info1.user_id = sal.user_id
where sal.activity = 'User skill deleted'
)
) x
order by user_id, latest_modified_time desc;
将您的查询用作子选择,使用rank() OVER (PARTITION BY user_id ORDER BY latest_modified_time DESC)
外部查询,并使用仅选择那些排名为1的行的外部查询。
这将为您提供每个用户的所有记录,其中latest_modified_time
是最大的。
SELECT user_id,
latest_modified_time,
full_name
FROM (SELECT user_id,
latest_modified_time,
full_name,
rank() OVER (PARTITION BY user_id ORDER BY latest_modified_time DESC)
FROM (SELECT us.user_id AS user_id,
us.modified_datetime AS latest_modified_time,
CONCAT(ui.first_name, ' ', ui.last_name) AS full_name
FROM lsa_user_skill AS us
LEFT JOIN lsa_user_info AS ui ON us.modified_user_id = ui.user_id
WHERE (us.user_id, us.modified_datetime) IN
(SELECT us.user_id, MAX(us.modified_datetime)
FROM lsa_user_skill AS us
GROUP BY us.user_id)
UNION
SELECT sal.affected_user_id AS user_id,
sal.modified_timestamp AS latest_modified_time,
CONCAT(info1.first_name, ' ', info1.last_name) AS full_name
FROM lsa_skill_auditlog AS sal
LEFT JOIN lsa_user_info AS info ON info.user_id = sal.affected_user_id
LEFT JOIN lsa_user_info AS info1 ON info1.user_id = sal.user_id
WHERE sal.activity = 'User skill deleted'
) AS v_union
) AS v_ordered
WHERE rank = 1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.