繁体   English   中英

如何使用group by子句从每个用户的两个子查询的结果集中获取max(latest_modified_time)记录?

[英]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'

您可以在以下位置使用uniondistinct 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM