Выбрать оператор, но вернуть только самый последний элемент другой объединенной таблицы - PullRequest
0 голосов
/ 05 ноября 2018

Допустим, я выбираю детали кандидатов и историю их работы.

Select candidate.id, candidate.firstname +' '+ candidate.lastname as 'Candidate Name', cwh.dateworked
from candidate
inner join canworkhistory cwh on candidate.id = cwh.candidateid

Теперь есть несколько записей для дат, отработанных кандидатом, но мне нужна только самая последняя.

Как мне заказать эти подпункты, чтобы верхняя 1 возвращалась в приведенном выше запросе?

Ответы [ 5 ]

0 голосов
/ 05 ноября 2018

Вы также можете попробовать использовать CTE

;WITH RecentWork
     AS (SELECT
           candidateid
           ,max(dateworked)
         FROM
           canworkhistory
         GROUP  BY
          candidateid)
SELECT
  candidate.id
  ,candidate.firstname + ' ' + candidate.lastname AS 'Candidate Name'
  ,RecentWork.dateworked
FROM
  candidate
  INNER JOIN RecentWork
          ON candidate.id = RecentWork.candidateid 
0 голосов
/ 05 ноября 2018

вы можете попробовать как ниже

 with cte as
   (
    Select candidate.id, candidate.firstname +' '+ candidate.lastname 
    as 'Candidate   Name', cwh.dateworked
    from candidate
    inner join canworkhistory cwh on candidate.id = cwh.candidateid
  ) select t.* from cte t where t.dateworked =
                ( select max(dateworked) from canworkhistory t1
                   where t1.candidateid=t.id
                     group by candidateid
                   )
0 голосов
/ 05 ноября 2018

Вы можете использовать производную таблицу с group by и max:

Select candidate.id, 
       candidate.firstname +' '+ candidate.lastname as 'Candidate Name', 
       cwh.dateworked
from candidate
inner join (
    select candidateid, max(dateworked) as dateworked
    from canworkhistory
    group by candidateid
) cwh on candidate.id = cwh.candidateid
0 голосов
/ 05 ноября 2018

Вы можете ВНЕШНЕЕ ПРИМЕНИТЬ последнюю строку:

Select candidate.id, candidate.firstname +' '+ candidate.lastname as 'Candidate Name', cwh.dateworked
outer apply (select top 1 * from canworkhistory where candidate.id = canworkhistory.candidateid order by dateworked desc) cwh
from candidate
0 голосов
/ 05 ноября 2018

Вы можете попробовать использовать оконную функцию - row_number ()

select * from
(
Select candidate.id, candidate.firstname +' '+ candidate.lastname as 'Candidate Name', cwh.dateworked,row_number() over(partition by candidate.id order by cwh.dateworked desc) as rn
from candidate inner join canworkhistory cwh 
on candidate.id = cwh.candidateid
)X where rn=1
...