#sql #oracle #window-functions
Вопрос:
Я не очень компетентен в Oracle SQL, и мне поручили эту задачу. Я хочу найти предыдущие записи с тем же идентификатором и вычислить разницу между их значениями table_values. То, что я сделал до сих пор, — это выбор, который показывает предыдущее значение там, где оно существует, однако я не могу вычислить разницу, и я получаю синтаксические ошибки в своих запросах. Я попытался ВЫБРАТЬ *,ЗНАЧЕНИЕ ТАБЛИЦЫ-ПРЕДЫДУЩЕЕ ЗНАЧЕНИЕ, но, по-видимому, я неправильно формулирую его. Вся помощь признательна!
Мой Код:
SELECT *
FROM(
SELECT
TABLE_ID,
TABLE_VALUE,
YEAR,
MONTH,
LAG(TOWER_VALUE) OVER (
PARTITION BY TABLE_ID
ORDER BY YEAR,MONTH) PREVIOUS_VALUE
FROM
MY_TABLE)
;
Ответ №1:
Вам не нужен подзапрос. Вы можете использовать:
select t.*,
(tower_value -
lag(tower_value) over (partition by table_id order by year, month)
) as diff
from my_table t;
Если вы используете подзапрос, вам необходимо указать *
. Итак, в вашем случае:
select t.*,
(value - previous_value) as diff
from ( . . .
) t;
Другими словами, Oracle рассматривает select *
select
предложение как завершенное. Вы больше ничего не можете к этому добавить. Чтобы сделать то, что вы хотите, вам нужно квалифицировать *
, а затем вы можете добавить дополнительные столбцы.
Комментарии:
1. Вау, это очень полезный не только ответ, но и объяснение запроса Oracle select, который дал мне понимание, которого у меня раньше не было. Большое вам спасибо!
2. @JamesTheProg . . . Я рекомендую (в целом) уточнять имена столбцов и
*
, но я думаю, что Oracle-единственная база данных, которая имеет это ограничение.