Команда SQL для вычисления разницы между 2 столбцами

#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-единственная база данных, которая имеет это ограничение.