我有类似的查询:
select a.id,
a.date,
-- case statements using h.fields
from advr a,
(select id,
date,
advr_id,
advr_nbr,
row_number() over(partition by id, date order by advr_nbr) adv_number
from advr_hist) h
where a.id = h.id
and a.date = h.date
group by a.id, a.date
我的许多案例陈述的一个例子:
max(case
when h.adv_number = 1 then
h.advr_id
else
' '
end) advr_1
这非常有效,但加载速度非常慢。如果我删除案例语句和 h
表,一切都很快。如果我只是查询h
select语句,一切都很快。然而加入它们会使它运行得很慢,所以我考虑将其作为一种观点重新加工。
如何从select语句获得相同的结果,但在外部select语句中有row_number()adv_number
字段?希望这是有道理的。
答案 0 :(得分:1)
with result (id,date,_id)
as (
select id,date,
case when row_number() over(partition by id, date order by advr_nbr)=1
then 1 else 0 end as [_id]
from advr_hist)
select id,date from result
where _id=1
答案 1 :(得分:0)
您尚未发布任何执行计划。您也没有试图解释您的查询尝试做什么。所以我们所能做的就是猜测。
我的猜测是,您只需要来自子查询中最早行的详细信息。您当前的实现使用聚合来执行此操作,这将生成各种各样的CPU周期。因此,可能不是加入问题,而是过滤子查询。
在这种情况下,你可以这样做:
select a.id,
a.date,
h.advr_id as advr_1
from advr a,
(select id,
date,
advr_id,
advr_nbr,
row_number() over(partition by id, date order by advr_nbr) adv_number
from advr_hist) h
where a.id = h.id
and a.date = h.date
and h.adv_number = 1
如果这不能产生您想要的结果,则需要编辑您的问题并提供更多详细信息。
"所以我考虑将此作为一种观点重新加工。"
视图是一种便利而非性能增强。