2013-10-28 8 views
1

Я пытаюсь найти разницу между каждой строкой с предыдущей строкой в ​​таблице.Как сравнить строку с предыдущей строкой в ​​Oracle SQL?

Когда я говорю разницу, я имею в виду, являются ли два значения одинаковыми или нет.

Я не уверен, нужен ли мне цикл for, а также если таблица содержит от 30 до 40 столбцов, это означает, что мне нужно будет написать чек для каждого из этих 30-40 столбцов?

  • Row1 - ID1 - data1 - data2 - data3 ..
  • Стр2 - ID1 - data1 - data2 - data3 ..
  • Row3 - ID2 - data1 - data2 - data3 ..
  • Row4 - ID1 - data1 - data2 - data3 ..

    for i = 2 .. 3 
    is Row[i][data1] != Row[i-1][data1], Row[i][data2] != Row[i-1][data2].... 
    

Эта проверка должна быть сделана для всех записей с одинаковым неуникальным ID. то есть. ID1 может существовать для нескольких записей. Строки с ID1 необходимо сравнить с другими строками ID1.

+0

Что вы заказе от? Заказ отсутствует, если нет «ORDER BY». –

+0

Пока данные находятся в таблице, есть поле, которое будет использоваться для заказа данных. После завершения этой процедуры/кода данные должны быть выведены. – CP3O

+0

Если это можно сделать в SQL, было бы здорово. – CP3O

ответ

3

Вы можете использовать Oracle lag Analitic функцию. Предположим, что ваша таблица такова:

CREATE TABLE tbl (no int, id int, val1 int, val2 int) 

где no это поле, на котором упорядочивается данные, id ваш не-уникальный идентификатор (идентификатор группы), val1 и val2 являются значения. Чем вы можете использовать этот запрос, чтобы найти, если каждая строка является дубликатом предыдущего ряда в своей группе:

select no, id, val1, val2, 
case when 
    lag(val1,1) over (partition by id order by no) = val1 and 
    lag(val2,1) over (partition by id order by no) = val2 
then 1 else 0 end duplicate 
from tbl 
order by no 

Here it is in SQLfiddle

+0

Это действительно здорово, но здесь он проверяет, равна ли вся строка предыдущей строке, как бы проверить, отличается ли один или два столбца от предыдущего? Т.е. Я не вижу, если каждая строка равна предыдущей, мне нужно проверить, какие из полей не равны полям предыдущей строки. – CP3O

+0

'НА TBL (нет, идентификатор, знач1, знач2) \t \t ЗНАЧЕНИЯ (2, 1, 3, 3) \t НА TBL (нет, идентификатор, знач1, знач2) \t \t ЗНАЧЕНИЯ (3, 1, 3, 4) ' с использованием приведенных выше инструкций. У меня есть первый 'val1' = второй' val1', т.е. '3 == 3', , но первый' val2! = 'Второй' val2', т.е. '3! = 4', Как бы я это обнаружил? – CP3O

+0

Может быть, вот так - http://sqlfiddle.com/#!4/cebe7/1? –

0

попробуйте это !!

сравнивая таблицу с собственным PK-х

select t1.value - t2.value from table t1, table t2 
    where t1.primaryKey = t2.primaryKey - 1 
Смежные вопросы