sql - 在 SQL Server 中使用带有 partition by by 的 Case 语句
问题描述
嗨,我正在尝试从此代码中获取以下内容如果有多个匹配项,请找到 LearnStartDate = LearnDelFAMDateFrom 的记录,否则留空
select
ukprn, aimseqnumber, LearnRefNumber
,LearnDelFAMCode
,LearnDelFAMType
,LearnDelFAMDateFrom
,LearningStartDate
,CASE
when rn=1 then LearnDelFAMDateFrom
when rn <1 then ''
when (rn =1 and rn > 1) and (LearningStartDate = LearnDelFAMDateFrom) then LearnDelFAMDateFrom
else
''
end as LearnDelFAMDateFromMOD
--,CASE row_number() over(partition by d.LearnRefNumber,d.aimseqnumber order by LearnDelFAMDateFrom)
-- when 1 then LearnDelFAMDateFrom
-- when < 1 then ''
-- when > 1 and (LearningStartDate = LearnDelFAMDateFrom) then LearnDelFAMDateFrom
-- else ''
-- end as LearnDelFAMDateFromMOD2
,rn
--,LearnDelFAMDateTo
from
(select
d.ukprn,d.aimseqnumber,d.LearnRefNumber,LearnDelFAMCode,LearnDelFAMType
,convert(varchar(10),LearnDelFAMDateFrom) as LearnDelFAMDateFrom
,LearnDelFAMDateTo,LearningStartDate
,row_number() over(partition by d.LearnRefNumber,d.aimseqnumber order by LearnDelFAMDateFrom) rn
from d
left join rp
on
d.ukprn =rp.ukprn
and d.aimseqnumber=rp.AimSeqNumber
and d.LearnRefNumber=rp.LearnRefNumber
and LearnDelFAMCode=rp.ApprenticeshipContractType
left join aecld
on
d.ukprn =aecld.ukprn
and d.aimseqnumber=aecld.AimSeqNumber
and d.LearnRefNumber=aecld.learnrefnumber
where LearnDelFAMType='ACT'
) as ref
由于我不能使用大于或小于或等号,因此无法运行包含分区大小写的代码的注释部分。
如果我只是在 (rn =1 and rn > 1) 和 (LearningStartDate = LearnDelFAMDateFrom) 的情况下使用 case 语句,那么 LearnDelFAMDateFrom 这仅适用于当 rn = 1 时 rn >1 时的记录,它不起作用。
解决方案
我建议为此任务使用 CTE 表,ROW_NUMBER()... AS rn 将被解析,然后您可以在您的案例语句中使用它
;WITH CTE_TEMP_TABLENAME AS
(
select
d.ukprn,d.aimseqnumber,d.LearnRefNumber,LearnDelFAMCode,LearnDelFAMType
,convert(varchar(10),LearnDelFAMDateFrom) as LearnDelFAMDateFrom
,LearnDelFAMDateTo,LearningStartDate
,row_number() over(partition by d.LearnRefNumber,d.aimseqnumber order by LearnDelFAMDateFrom) rn
from d
left join rp
on
d.ukprn =rp.ukprn
and d.aimseqnumber=rp.AimSeqNumber
and d.LearnRefNumber=rp.LearnRefNumber
and LearnDelFAMCode=rp.ApprenticeshipContractType
left join aecld
on
d.ukprn =aecld.ukprn
and d.aimseqnumber=aecld.AimSeqNumber
and d.LearnRefNumber=aecld.learnrefnumber
where LearnDelFAMType='ACT'
)
select
ukprn
,aimseqnumber
,LearnRefNumber
,LearnDelFAMCode
,LearnDelFAMType
,LearnDelFAMDateFrom
,LearningStartDate
,CASE
when rn=1 then LearnDelFAMDateFrom
when rn <1 then ''
when (rn =1 and rn > 1) and (LearningStartDate = LearnDelFAMDateFrom)
then LearnDelFAMDateFrom
else
''
end as LearnDelFAMDateFromMOD
,rn
,LearnDelFAMDateTo
FROM CTE_TEMP_TABLENAME
推荐阅读
- language-agnostic - 在 CQRS 工作流中获取另一个域的数据的推荐方法是什么?
- neo4j - 如何从 Neo4j 中的内部 apoc.periodic.iterate 语句中获取日志条目?
- angular - 如何获取完整日历的列标题的thead值
- javascript - VirtualizedList:缺少项目的键 - React Native
- linux - 那是什么命令?导出 PATH=~/.local/bin:$PATH
- javascript - 如何捕获 URL 参数并传递给 url 重定向
- python - 如何创建一个使用 C 扩展的 Python 库?
- angular - 麻烦更改角度路由
- kubernetes - GKE 中的协调.k8s.io api
- c - 如果 m != n,确定 n^m = m^n 的最快方法是什么?