DENSE_RANK()的结果可以用在当前select语句的SUM中吗

Can the result of DENSE_RANK () be used in a SUM of the current select statement

  1. 我有一个 table 保存周一至周日的每日时间,我有一个计算和 return 每周总计的函数。我根据当前周对这些进行求和,并按 element_id 和 start_date 进行分区,调用结果 WEEK_HRS_TOTAL.

这会得出每周的总数。

SUM(GENERATED_FOR_WEEK(et.START_DATE, et.END_DATE, elm.element_id, MON...SUN_ )) OVER(PARTITION BY elm.element_id, et.START_DATE)as WEEK_HRS_TOTAL
  1. 我在这个 select 中还有另一个与上面的函数完全相同的求和函数,除了这个求和是计算当年 WEEK_HRS_TOTAL 的总和。因此,每个条目的培养总数为 运行。但是,在这个总和中,我按 elm.Name 和子元素名称 elm.SubName 和 return 划分为 HRS_TOTAL_YEAR

    SUM(GENERATED_FOR_YEAR(et.START_DATE, et.END_DATE, elm.element_id, MON...SUN_ )) OVER(PARTITION BY elm.Name, elm.SubName)作为HRS_TOTAL_YEAR

结果按预期工作,但问题是将显示每条记录的总数,需要它显示为 运行 总数。

示例:

ELM NAME    ELM SUB_NAME       WEEK_HRS_TOTAL       HRS_TOTAL_YEAR 
DOOR          KNOB                  12                  37
DOOR          KNOB                  23                  37
DOOR          KNOB                  2                   37
DOOR          PAINT                 3                   10
DOOR          PAINT                 4                   10
DOOR          PAINT                 3                   10

我会尝试使用

DENSE_RANK 根据给定

的 elm.SubName 生成一个列
ELM NAME    ELM SUB_NAME       WEEK_HRS_TOTAL  RANK     HRS_TOTAL_YEAR 
DOOR          KNOB                  12           1       37
DOOR          KNOB                  23           1       37
DOOR          KNOB                  2            1       37
DOOR          PAINT                 3            2       10
DOOR          PAINT                 4            2       10
DOOR          PAINT                 3            2       10

有没有办法让我的 HRS_TOTAL_YEAR 使用 RANK 列而不是 ELM SUB_NAME 来创建 运行 总数,结果如下?

ELM NAME    ELM SUB_NAME       WEEK_HRS_TOTAL  RANK     HRS_TOTAL_YEAR 
DOOR          KNOB                  12           1       12
DOOR          KNOB                  23           1       35
DOOR          KNOB                  2            1       37
DOOR          PAINT                 3            2       3
DOOR          PAINT                 4            2       7
DOOR          PAINT                 3            2       10


Create or Replace "WEEK_HRS_TOTAL" (p_start_date et.start_date%type,
                                    p_end_date   et.end_date%type,
                                    p_elm_id     elm.element_id,
                                    p_sun_hrs    et.sun_hrs
                                    .....this continues for each day of the week) Return Number AS
lv_dollar_gen_sum number;
lv_start_date date;
lv_end_date date;
lv_rate elm.rate%type;

begin
  loop
  exit when lv_start_date >= lv_end_date;

  select r.rate into lv_rate 
  from hour_rate r 
  where r.element_id = p_element_id and
        r.start_date <= lv_start_date and
        r.end_date  > lv_start_date;

  lv_dollar_gen_sum := lv_dollar_gen_sum + (p_mon_hrs * lv_rate);
  lv_start_date := lv_start_date + 1;

我们对一周中的每一天都这样做,然后 return 结果。这两个函数做同样的事情,但是 WEEKS_HRS_TOTAL 函数调用的分区基于 element_id 和 et.start_date

虽然 HRS_TOTAL_YEAR 的分区基于 elm.Name,elm.SubName

您只需将 ORDER BY 添加到 SUM()。但是,您的数据没有明显的列:

SUM(GENERATED_FOR_YEAR(et.START_DATE, et.END_DATE, elm.element_id, MON...SUN_ )) OVER
        (PARTITION BY elm.Name, elm.SubName
         ORDER BY ??
        ) as HRS_TOTAL_YEAR

您显示的数据中没有任何内容符合您的要求。