如何在外部select语句中使用row_number over partition?

时间:2014-11-26 18:59:18

标签: sql oracle query-optimization window-functions

我有类似的查询:

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字段?希望这是有道理的。

2 个答案:

答案 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

如果这不能产生您想要的结果,则需要编辑您的问题并提供更多详细信息。

  

"所以我考虑将此作为一种观点重新加工。"

视图是一种便利而非性能增强。