首页 > 解决方案 > 带有条件的 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

您可以提供的任何帮助将不胜感激

标签: sqlperformanceoptimizationmaxmin

解决方案


对于此查询:

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;

我怀疑这真的会影响性能,但对我来说似乎更简单。


推荐阅读