简体   繁体   中英

join 2 tables and get some columns from 1st table and max timestamp value from second table

I have a employee table

empid empname status
1     raj     active
2     ravi    active
3     ramu    active
4     dan     active
5     sam     inactive

I have another table called facilities

empid timestamp
1     2014-12-28 
1     2015-05-05 
1     2015-06-05 
2     2015-05-03 
2     2015-06-04 
3     2015-02-01

I want my result like

empid empname status lastusedts
1     raj     active 2015-06-05
2     ravi    active 2015-06-04
3     ramu    active 2015-02-01
4     dan     active null

So i have to join my employee table and facilities table and find when the employee has last used the facilities by getting the max of time stamp and for employees who did not use it the timestamp value should be null and only active employees are to be fetched. Please help me in writing this query in db2

Do a LEFT JOIN with a GROUP BY to find the MAX (timestamp):

select e.empid, e.empname, e.status, max(timestamp) as lastusedts
from employee e
  left join facilities f on e.empid = f.empid
where e.status = 'active'
group by e.empid, e.empname, e.status

Alternatively, a correlated sub-select for the max-timestamp:

select e.empid, e.empname, e.status, (select max(timestamp) from facilities f
                                      where e.empid = f.empid) as lastusedts
from employee e
where e.status = 'active'

try this

SELECT employee.empid, employee.empname, employee.status,facilities.timestamp as lastusedts
FROM employee
INNER JOIN facilities
ON employee.empid=facilities.empid;
 SELECT e.empid, e.empname, e.status, MAX(f.timestamp) AS lastusedts 
 FROM employee e LEFT OUTER JOIN facilities f ON e.empid = f.empid 
 WHERE e.status = 'active' GROUP BY e.empid, e.empname, e.status 

Common table expressions [CTE's] are one way you can break a problem down into easier chunks.

with m as
(
  select empid
        ,max(timestamp) as lastusedts
    from facilities
    group by e.empid
)
select e.empid
      ,e.empname
      ,e.status
      ,m.lastusedts
  from employee e
  left join  m 
     on e.empid = m.empid
  where e.status = 'active'

Common table expressions [CTE's] are one way you can break a problem down into easier chunks.

with m as
(
  -- get last timestamp per employee
  select empid
        ,max(timestamp) as lastusedts
    from facilities
    group by e.empid
)
-- report employee info with last timestamp
select e.empid
      ,e.empname
      ,e.status
      ,m.lastusedts
  from employee e
  left join  m 
     on e.empid = m.empid
  where e.status = 'active'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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