SQL性能从同一个表中多次排除
我有一张桌子,上面有一张名单,假设我有100个人在那张桌子上 我需要筛选出使用不同标准的人员并将他们分组,问题是当我在第4-5级开始排除时,性能问题出现了,并且变得缓慢SQL性能从同一个表中多次排除,sql,performance,Sql,Performance,我有一张桌子,上面有一张名单,假设我有100个人在那张桌子上 我需要筛选出使用不同标准的人员并将他们分组,问题是当我在第4-5级开始排除时,性能问题出现了,并且变得缓慢 with lst_tous_movements as ( select t1.refid_eClinibase t1.[dthrfinmouvement] t1.[unite_service_id] t1.[unite_service_suiv_id]
with lst_tous_movements as (
select
t1.refid_eClinibase
t1.[dthrfinmouvement]
t1.[unite_service_id]
t1.[unite_service_suiv_id]
from sometable t1
)
,lst_patients_hospitalisés as (
select distinct
t1.refid_eClinibase
from lst_tous_movements t1
where
t1.[dthrfinmouvement] = '4000-01-01'
)
,lst_patients_admisUIB_transferes as (
select distinct
t1.refid_eClinibase
from lst_tous_movements t1
left join lst_patients_hospitalisés t2 on t1.refid_eClinibase = t2.refid_eClinibase
where
t1.[unite_service_id] = 4
and t1.[unite_service_suiv_id] <> 0
and t2.refid_eClinibase is null
)
,lst_patients_admisUIB_nonTransferes as (
select distinct
t1.refid_eClinibase
from lst_tous_movements t1
left join lst_patients_admisUIB_transferes t2 on t1.refid_eClinibase = t2.refid_eClinibase
left join lst_patients_hospitalisés t3 on t1.refid_eClinibase = t3.refid_eClinibase
where
t1.[unite_service_id] = 4
and t1.[unite_service_suiv_id] = 0
and t2.refid_eClinibase is null
and t3.refid_eClinibase is null
)
,lst_patients_autres as (
select distinct
t1.refid_eClinibase
from lst_patients t1
left join lst_patients_admisUIB_transferes t2 on t1.refid_eClinibase = t2.refid_eClinibase
left join lst_patients_hospitalisés t3 on t1.refid_eClinibase = t3.refid_eClinibase
left join lst_patients_admisUIB_nonTransferes t4 on t1.refid_eClinibase = t4.refid_eClinibase
where
t2.refid_eClinibase is null
and t3.refid_eClinibase is null
and t4.refid_eClinibase is null
)
谢谢。很难准确理解问题中的所有规则,但一般的方法应该是在单个查询中添加一个“分组”列,使用
CASE
语句对人员进行分类
案例中的条件按顺序求值,因此如果满足第一个条件,则后续条件甚至不会针对该行求值
这里有一些代码让你开始
select t1.refid_eClinibase
,t1.[dthrfinmouvement]
,t1.[unite_service_id]
,t1.[unite_service_suiv_id]
CASE WHEN [dthrfinmouvement] = '4000-01-01' THEN 'Group1 Label'
WHEN condition2 = something THEN 'Group2 Label'
....
WHEN conditionN = something THEN 'GroupN Label'
ELSE 'Catch All Label'
END as person_category
from sometable t1
你会拉小提琴吗?我不清楚你在询问结束时想要什么。它只是最终的过滤集,还是所有的过滤集?你在使用什么数据库?嗨,在查询结束时,我将拥有相同的数据集,但在一个新列中为每个人分配了组,通过左连接,我可以说这个人属于这个组…我现在在外面,我回家后会发布尽可能多的信息,谢谢。嗨,谢谢你的回答,然而,在我的情况下,这种方法不起作用,因为同一个人可以分为不同的类别,我需要同一个人保持在分配给他们的原始类别中,我希望我的解释有点清楚,谢谢在这种情况下,(这在你的问题中根本不清楚),我将使用一个布尔值使每个类别在视图中成为自己的列,该布尔值指示行是否是该类别的成员。顺便说一句,你可能想编辑这个问题,因为你使用的排除(在所有大写字母中)倾向于表明分组是相互排斥的。嗨,已经有一段时间了,我再次着手解决这个问题,但我遵循了你的建议,通过给它们一个重要顺序的数值,然后用最小值分配一个类别,我能够将类别与案例一起放置,这大大加快了我的查询速度,如果你想要信息,我可以稍后发布我的解决方案,谢谢。
select t1.refid_eClinibase
,t1.[dthrfinmouvement]
,t1.[unite_service_id]
,t1.[unite_service_suiv_id]
CASE WHEN [dthrfinmouvement] = '4000-01-01' THEN 'Group1 Label'
WHEN condition2 = something THEN 'Group2 Label'
....
WHEN conditionN = something THEN 'GroupN Label'
ELSE 'Catch All Label'
END as person_category
from sometable t1