Как я могу удалить псевдодубликаты? - PullRequest
1 голос
/ 27 октября 2010

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

delete from tbstage where rowid in (
     select rowid from tbstage
   minus
     select min(rowid) from tbstage group by pkeyCol1, pkeyCol2, otherCols
);

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

      pkeyCol1, pkeyCol2, otherCol1, otherCol2
row1: 123,      ABC,      (null),    hello 
row2: 123,      ABC,      important, hello

В этом случае я бы хотел избавиться от row1 и сохранить row2. Что делает это немного хитрым, так это то, что otherCol1 может на законных основаниях быть нулевым, как и другие Col2. Если в row1 просто есть нули, а в row2 есть значения для тех же полей, то я хочу избавиться от row1.

Большое спасибо заранее - это приводит меня в бешенство уже несколько дней!

1 Ответ

2 голосов
/ 27 октября 2010

я это так ... Записи с нулевыми значениями будут последними (вторыми) в группе. Или вы можете использовать rn> 1, если у вас более двух дублированных строк.


SELECT ROWID FROM(
select t.*
      ,rowid
      ,row_number() over(PARTITION BY pkeycol1, pkeycol2 
                             ORDER BY othercol1,othercol2) rn
  from tbstage t)
  WHERE rn=2

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