Select 声明但只有 return 另一个加入的最新项目 table
Select statement but only return the most recent item of another joined table
假设我正在选择候选人的详细信息及其工作经历。
Select candidate.id, candidate.firstname +' '+ candidate.lastname as 'Candidate Name', cwh.dateworked
from candidate
inner join canworkhistory cwh on candidate.id = cwh.candidateid
现在有候选人工作日期的多个记录,但我只想要最近的一个。
如何对这些子项进行排序,以便在上述查询中返回前 1 项?
您可以尝试使用 window 函数 - 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
您可以将派生的 table 与 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
您可以外部应用最新行:
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
你可以试试下面的方法
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
)
您也可以尝试使用 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
假设我正在选择候选人的详细信息及其工作经历。
Select candidate.id, candidate.firstname +' '+ candidate.lastname as 'Candidate Name', cwh.dateworked
from candidate
inner join canworkhistory cwh on candidate.id = cwh.candidateid
现在有候选人工作日期的多个记录,但我只想要最近的一个。
如何对这些子项进行排序,以便在上述查询中返回前 1 项?
您可以尝试使用 window 函数 - 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
您可以将派生的 table 与 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
您可以外部应用最新行:
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
你可以试试下面的方法
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
)
您也可以尝试使用 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