сравнение 2 последовательных строк в наборе записей - PullRequest
2 голосов
/ 28 октября 2010

В настоящее время у меня есть эта цель, чтобы встретиться.Мне нужно запросить базу данных для определенных результатов.После этого мне нужно будет сравнить записи: Например: запрос возвращает мне 10 записей, мне нужно сравнить: строку 1 с 2, строку 2 с 3, строку 3 с 4 ... строка 9с 10.

Конечный результат, который я хочу получить, составляет 10 или менее 10 строк записей.

У меня есть один подход в настоящее время.Я делаю это внутри функции, у руки есть переменные, вызывающие «предыдущий» и «текущий».В цикле я всегда буду сравнивать предыдущий и текущий, которые я заполняю через набор записей с помощью курсора.

После того, как я получу каждую строку отфильтрованного результата, я внесу его во временную физическую таблицу.После того, как все результаты находятся в этой временной таблице.Я сделаю запрос к этой таблице и вставлю результат в курсор, а затем верну курсор.

Проблема в том, как мне не использовать временную таблицу.Я искал в Интернете информацию об использовании вложенных таблиц, но почему-то я просто не мог заставить его работать.

Как заменить временную таблицу чем-то другим?Или есть другой подход, который я могу использовать для сравнения столбцов строк с другими строками.

РЕДАКТИРОВАТЬ

Извините, может быть, я не совсем понял свой вопрос.Вот пример результата, которого я пытаюсь достичь.

TABLE X

Column A    B       C       D
   100      300     99      T1
   100      300     98      T2
   100      300     97      T3
   100      100     97      T4
   100      300     97      T5
   101      11      11      T6

ColumnA - это первичный ключ таблицы.ColumnA имеет дубликаты, потому что таблица X является таблицей аудита, которая отслеживает все изменения. Столбец D действует как метка времени для этой записи.

Для моего запроса меня интересуют только изменения в столбце A, Bи D. После запроса я хотел бы получить результат, как показано ниже:

Column A    B       D
   100      300     T1
   100      100     T4
   100      300     T5
   101      11      T6

Ответы [ 5 ]

6 голосов
/ 28 октября 2010

Я думаю, что Analytics может делать то, что вы хотите:

select col1, col2, last(col1) over (order by col1, col2) LASTROWVALUE
from table1

таким образом, LASTROWVALUE будет содержать значение de col1 для последней строки, которое вы можете напрямую сравнить с col1 текущей строки.

Смотрите этот URL для получения дополнительной информации: http://www.orafaq.com/node/55

4 голосов
/ 17 августа 2012
SELECT ROW_NUMBER() OVER(ORDER BY <Some column name>) rn,
      Column1, <Some column name>, CompareColumn,
      LAG(CompareColumn) OVER(ORDER BY <Some column name>) PreviousValue,
      LEAD(CompareColumn) OVER(ORDER BY <Some column name>) NextValue,
      case       
          when CompareColumn != LEAD(CompareColumn) OVER(ORDER BY <Some column name>)  then CompareColumn||'-->'||LEAD(CompareColumn) OVER(ORDER BY <Some column name>)
          when CompareColumn = LAG(CompareColumn) OVER(ORDER BY <Some column name>) then 'NO CHANGE'        
          else 'false'     
      end  
FROM <table name>

Вы можете использовать эту логику в цикле для изменения поведения.

1 голос
/ 28 октября 2010

Что именно вы делаете для сравнения строк? Вы хотите устранить дубликаты или преобразовываете данные в другую форму, а затем возвращаете ее?

Чтобы устранить дубликаты, обратите внимание на использование функций GROUP BY или DISTINCT в вашем SELECT.

Если вы перебираете исходные данные и каким-то образом трансформируете их, то это трудно сделать без использования временной таблицы - но в чем конкретно заключается ваша проблема с временной таблицей? Если вас беспокоит производительность курсора, то, возможно, вы могли бы сделать один внешний SELECT, который сравнивает результаты двух внутренних SELECT, но хитрость заключается в том, что второй SELECT смещен на одну строку, поэтому вы выполняете требование сравнения строки 1 против строки 2 и т. д.

1 голос
/ 28 октября 2010

Я думаю, что вы усложняете ситуацию с временной таблицей. Это можно сделать с помощью курсора и 2 временных переменных. Вот псевдокод:

declare

v_temp_a%xyz;
v_temp_b%xyz;
i number;
cursor my_cursor is select xyz from xyz;

begin

i := 1;

for my_row in my_cursor loop
if (i = 1)
v_temp_a := my_row;
else
v_temp_b := v_temp_a;
v_temp_a := my_row;

/* at this point v_temp_b has the previous row and v_temp_a has the currunt row
compare them and put whatever logic you want */

end if

i := i + 1;

end loop

end
1 голос
/ 28 октября 2010

Привет. Не очень понятно, чего именно ты хочешь достичь.Но, возможно, вы можете получить результаты исходного запроса в коллекции PLSQL и использовать его для сравнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...