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