具有条件的 SQL table 值上的 MAX 或 MIN

MAX or MIN on SQL table value with condition

您好,我希望有人能告诉我一个更好的方法来执行此操作,我的方法很有效,但速度很慢,导致我的查询 运行 超过 4 秒。 table 都有索引,我在执行计划中看不到任何内容。

我想从我的 table 中获取最小 assessmentId,其中 initial = 1,以及最大 assessmentId。

有没有更好的方法加入table两次?

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;

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

转诊table是table患者与评估m:n关系的桥梁。由于您想要每个患者的某些评估 ID,因此有必要加入 tables,您已经在做的事情。但是,由于我们必须查找每个患者的所有评估以获得最大数量,因此我们可以即时获得最小的初始评估 ID:

select
  p.patientid,
  max(r.referralid),
  min(case when initial = 1 then assessmentoneid end),
  max(assessmentoneid)
from dbo.patient p
join dbo.referral r on on r.patientid = p.patientid
left join dbo.assessmentone a on a.referralid = r.referralid
where p.accountid = @paccountid
group by p.patientid;

您需要这些索引:

  • 患者(账户ID,患者ID)
  • 转诊(patientid,referralid)
  • assessmentone (referralid, assessmentoneid, initial)