Oracle SQL - как разделить по row_number

У меня есть этот оператор выбора, где я хотел бы иметь возможность разделить по row_number(), который я только что определил в предыдущей строке.

но я получаю "ORA-30483: оконные функции здесь не разрешены".

Как я могу разделить по row_number?
Если это невозможно, как я могу переписать это выражение "разделить на"?

SELECT DISTINCT
       ID "ID",
       career "Career",
       ROW_NUMBER ()
       OVER (PARTITION BY ID, Career
             ORDER BY ID, Career)
           "Row",
       (SUM (some numbers + some numbers)
        OVER (
            PARTITION BY ID,
                         (ROW_NUMBER ()
                          OVER (PARTITION BY ID, Career
                                ORDER BY ID, Career))))
           "All_Units"
FROM   TABLE       a .....

Вот образец. Что мне нравится делать, так это иметь разделение столбца "All_Units" по идентификатору, Row (Row is row_number() over (разделение по ID, порядок карьерного роста по ID, карьерный рост). Но я получаю сообщение об ошибке "оконные функции здесь запрещены" Таким образом, для 02233445 я бы хотел, чтобы All_Units был разделен по ID и строке, которая возвращает 251 для строки 1 - это ответ, который я хочу.

ID          Career     Row  All_Units 
01122334    GR         1    #    
01122334    GR         2    #
02233445    GR         1    251   
02233445    GR         2    100
02233445    LAW        1    251
04323333    GR         1    # 
04323333    GR         2    # 

1 ответ

Вам нужно будет использовать подзапросы, чтобы ссылаться на результат одной оконной функции внутри другой. Примерно так (не проверено):

SELECT DISTINCT
       a.emplid AS "Student ID",
       a.acad_career AS "Acad Career",
       a_row_number AS "Row",
       (SUM (
              (SELECT COALESCE (SUM (i.unt_passd_prgrss), 0)
               FROM   ps_stf_gr_term_vw i
               WHERE  a.emplid = i.emplid AND a.acad_career = i.acad_career)
            + (SELECT COALESCE (SUM (j.unt_trnsfr), 0)
               FROM   ps_stf_gr_trnsfr_v j
               WHERE  a.emplid = j.emplid AND a.acad_career = j.acad_career))
        OVER (PARTITION BY a.emplid, a_row_number))
           AS "All Units"
FROM   (SELECT a.*,
               ROW_NUMBER ()
               OVER (PARTITION BY a.emplid, a.acad_career
                     ORDER BY a.emplid, a.acad_career)
                   AS a_row_number
        FROM   table_a) a

Однако, если я правильно понимаю цель вашего запроса, это немного обходной способ достижения желаемого результата. Я обычно нахожу, что наличие подзапроса в списке столбцов указывает на то, что запрос пошел в неверном направлении.

Если цель состоит в том, чтобы каждый ряд table Я думаю, что наряду с номером строки и количеством пропущенных и перенесенных единиц, этот запрос был бы лучше (хотя он также не проверен).

SELECT a.emplid AS "Student ID",
       a.acad_career AS "Acad Career",
       ROW_NUMBER ()
       OVER (PARTITION BY a.emplid, a.acad_career
             ORDER BY a.emplid, a.acad_career)
           AS "Row",
       COALESCE (unt_passd_prgrss, 0) + COALESCE (unt_trnsfr, 0))
           AS "All Units"
FROM   table_a a
       LEFT JOIN
       (SELECT emplid,
               acad_career,
               COALESCE (SUM (unt_passd_prgrss), 0) AS unt_passd_prgrss
        FROM   ps_stf_gr_term_vw) i
           ON a.emplid = i.emplid AND a.acad_career = i.acad_career
       LEFT JOIN
       (SELECT emplid,
               acad_career,
               COALESCE (SUM (unt_trnsfr), 0) AS unt_trnsfr
        FROM   ps_stf_gr_trnsfr_v) j
           ON a.emplid = j.emplid AND a.acad_career = j.acad_career

Однако, хотя эти решения должны быть синтаксически правильными, я не верю, что они дадут желаемый результат. У меня нет достаточно информации, чтобы произвести это.

Другие вопросы по тегам