具有条件的 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)
您好,我希望有人能告诉我一个更好的方法来执行此操作,我的方法很有效,但速度很慢,导致我的查询 运行 超过 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)