sql - 带有条件的 SQL 表值的 MAX 或 MIN
问题描述
嗨,我希望有人能告诉我一个更好的方法来做到这一点,我有什么工作,但它很慢并且导致我的查询运行超过 4 秒。这些表都有索引,特别是在执行计划中我看不到任何东西。
我想从我的表中获取初始 = 1 的最小评估 ID,以及最大评估 ID。
有没有更好的方法来加入表格两次?
select
r.PatientId,
MAX(r.ReferralId),
MIN(a.AssessmentOneId),
MAX(a1.AssessmentOneId)
from dbo.Referral r
inner join dbo.Patient p on p.PatientId = r.PatientId
left join dbo.AssessmentOne a on a.ReferralId = r.ReferralId and a.Initial = 1
left join dbo.AssessmentOne a1 on a1.ReferralId = r.ReferralId
where
p.AccountId = @pAccountId
group by r.PatientId
我还使用子查询尝试了以下操作,但性能仍然很差。
select
r.PatientId,
MAX(r.ReferralId),
(Select MIN(a.AssessmentOneId) from dbo.AssessmentOne a where a.ReferralId = MAX(r.ReferralId) and a.Initial = 1),
(Select MAX(a.AssessmentOneId) from dbo.AssessmentOne a where a.ReferralId = MAX(r.ReferralId))
from dbo.Referral r
inner join dbo.Patient p on p.PatientId = r.PatientId
where
p.AccountId = @pAccountId
group by r.PatientId
您可以提供的任何帮助将不胜感激
解决方案
对于此查询:
select r.PatientId, MAX(r.ReferralId), MIN(a.AssessmentOneId),
MAX(a1.AssessmentOneId)
from dbo.Referral r inner join
dbo.Patient p
on p.PatientId = r.PatientId left join
dbo.AssessmentOne a
on a.ReferralId = r.ReferralId left join
dbo.AssessmentOne a1
on a1.ReferralId = r.ReferralId
where p.AccountId = @pAccountId
group by r.PatientId;
我会推荐关于Patient(AccountId, PatientId)
,Referral(PatientId, ReferralId)
和的索引AssessmentOne(ReferalId, Initial)
。
双连接有点奇怪。所以,我会把它写成:
select p.PatientId, max(r.ReferralId), max(a.AssessmentOneId),
max(case when a.Initial = 1 then a.AssessmentOneId end)
from dbo.Referral r inner join
dbo.Patient p
on p.PatientId = r.PatientId left join
dbo.AssessmentOne a
on a.ReferralId = r.ReferralId
where p.AccountId = @pAccountId
group by p.PatientId;
我怀疑这真的会影响性能,但对我来说似乎更简单。
推荐阅读
- arrays - 以最好的顺序和最快的时间找到一个特殊数组的峰值
- r - 删除具有重叠时间的行的有效方法
- angular - Angular无法初始化变量
- java - C++ 与 Java 中传递的函数参数
- c# - 我如何知道 SQL Server 连接在 C# winforms 中丢失
- reactjs - 如何在本机反应中为 TextInput 的值设置多种颜色
- eclipse - OpenChrom - IDE 用户产品未在 Eclipse 安装程序简单模式下显示
- c - C中的多线程字数
- swift - 关于线程 1:致命错误:在隐式展开可选值时意外发现 nil
- java - 在 Twitter 登录后 response.sendRedirect() 不会重定向到回调