2011-12-29 6 views
0

Пожалуйста, помогите мне в решении нижеуказанного запроса. Предположим, что у меня есть имя таблицы как данные с 3 строками: Date1, Date2 и окно посещения. Мне нужно вычислить значение окна посещения. Это должна быть разница (n + 1) -й строки даты 1 и n-й строки даты2. Например: разница 2-го значения строки Date1 и 1-й строки значения date2, деленная на 7. Пожалуйста, помогите.Рассчитать разницу между значениями в разных строках и столбцах

Table: Data 
------------ 
Date1   Date2   VW 
13-DEC-2011  15-DEC-2011  ? 
18-DEC-2011  16-DEC-2011  ? 
21-DEC-2011  24-DEC-2011  ? 

Благодаря

+3

Что СУБД вы используете? Есть ли у вас первичный ключ в вашей таблице? Каков тип данных Date1 и Date2? Откуда вы знаете, какая строка является первой строкой? Является ли это строкой с самым низким значением в Date1? –

+0

Мы используем Oracle 11g, Data type - Date. Он может иметь первичные ключи и может иметь меньшую дату также в date1. Мне просто нужен образец запроса для извлечения значений для окна «Посещение». Это еще одна загадка, которая еще не реализована. – shubcbe

+1

Вы должны взглянуть на функцию 'lead'. Он используется для доступа к данным из следующей строки, поэтому вы можете использовать это значение и рассчитать разницу между текущей строкой и следующей строкой. –

ответ

4
select 
    Date1, 
    Date2, 
    lead(Date1) over (order by Date1) next_date1, 
    ((lead(Date1) over (order by Date1)) - Date2)/7 as Diff 
From DATA_TABLE 

Для последней строки, вы не получите каких-либо VW, потому что нет п + 1 Date1.

lead(column) функция возвращает значение для параметра column из следующей строки, как указано в предложении over.

Примеры и другие подобные функции here.

UPDATE (ответ на вопрос комментарий - как сравнить с другой колонке)

select 
    Date1, 
    Date2, 
    Diff, 
    another_column, 
    CASE 
    when Diff < another_column then 'it is lower' 
    when Diff > another_column then 'it is higher' 
    when Diff = another_column then 'are equal' 
    END as comparation, 
    CASE 
    when round(diff -another_column,3) = 0 then 'almost equal' 
    else 'definitely not equal' 
    END as rounded_comparation 
from(
    select 
     Date1, 
     Date2, 
     lead(Date1) over (order by Date1) next_date1, 
     ((lead(Date1) over (order by Date1)) - Date2)/7 as Diff, 
     another_column 
    From DATA_TABLE 
) 
+0

Как я могу добавить к нему 7 разделов. Будет ли он извлекать значения для всех строк в таблице. Еще один запрос, возможно, объяснит, как работает функция Lead в этом случае. Да, последняя строка не должна извлекать какие-либо значения из-за условия. Огромное спасибо. – shubcbe

+0

Я обновил свой ответ; добавлен столбец next_date1, чтобы увидеть, как он работает. –

+0

Большое спасибо florin :) – shubcbe

Смежные вопросы