2010-10-28 4 views
2

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

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

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

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

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

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

EDIT

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

Таблица 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 

ответ

1

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

1

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

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

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

1

Я думаю, что вы усложняете ситуацию с помощью таблицы temp. Это может быть сделано с помощью курсора и 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 
6

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

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

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

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

4
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> 

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

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