SQL-выбор между повторяющимися строками путем сравнения значений полей

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

NSERT INTO temp_Log  
SELECT dq1.RowID,dq1.Action FROM DQLog dq1
    WHERE dq1.RowID 
    NOT IN (SELECT RowID FROM DQLog dq2
                group by dq2.RowID
                having count(*)>1

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

RowID  Action 
 1     Reject
 1     Allow
 2     Allow
 2     Fix

В этом случае мне нужно будет только вставить первый ( INSERT INTO temp_Log ( SELECT различный RowID , Action FROM DQLog Where Action = 'Reject " UNION ALL SELECT, отличный RowID , Action FROM DQLog Where Action = ' Fix ' и RowID не в ( выберите отдельный RowID из DQLog, где Action = 'Reject' ) ) ; + allow = Reject) и последней строки (Allow + Update DQLog set Action = Lower ( Action ); = Fix).

Спасибо всем за ваше время.

mysql,sql,insert,duplicates,data-warehouse,

1

Ответов: 2


0 принят

Если невозможно, что Row_ID имеет действие «Разрешить как действие» более одного раза, следующий запрос должен работать:

INSERT INTO temp_Log  
(SELECT distinct RowID,Action           
FROM DQLog 
Where Action = 'reject'
UNION ALL
SELECT distinct RowID,Action           
FROM DQLog 
Where Action = 'fix'
And RowID not in (Select distinct RowID from DQLog where Action='reject')
)
;

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

Я упомянул 2 варианта в своем комментарии. Вот так оно и есть:

Вариант 2 : :

Преобразуйте столбцы Action в нижние регистровые значения.

Fix

Вышеприведенный запрос преобразует все значения Actionв нижнем регистре. Теперь вы можете запустить следующий запрос, и это сделано:

Reject

Следовательно, ваша задача выполнена, и ваши избыточные данные также исправлены.

INSERT INTO temp_Log  
(SELECT distinct RowID,Action           
FROM DQLog 
Where Action = 'Reject' or Action='reject'
UNION ALL
SELECT distinct RowID,Action           
FROM DQLog 
Where Action = 'Fix' or Action = 'fix'
And RowID not in (Select distinct RowID from DQLog where Action='Reject'or Action='reject')
)
;

Просто добавьте все возможные варианты Fixи Rejectв где предложение моего основного запроса выглядит следующим образом:

Option 1

Я советую вам пойти Option 1!

Надеюсь, поможет!


1

Я бы назвал это следующим:

INSERT INTO temp_Log (?, ?)  -- put the column names here
    SELECT dq1.RowID,
           (CASE WHEN MIN(dq1.Action) = MAX(d1.Action) THEN MIN(dq1.Action)
                 WHEN SUM(dq1.Action = 'Allow') > 0 AND SUM(dq1.Action = 'Reject') > 0 THEN 'Reject'
                 WHEN SUM(dq1.Action = 'Allow') > 0 AND SUM(dq1.Action = 'Fix') > 0 THEN 'Fix'
                 ELSE ??  -- your rules don't specify
           END) as Action
    FROM DQLog dq1
    WHERE NOT EXISTS (SELECT 1
                      FROM DQLog d12 
                      WHERE dq1.RowID = dq2.RowID
                     )
GROUP BY dq1.RowId;

Заметки:

  • Перечислите столбцы при вставке. Это лучшая практика и предотвратит ошибки кодирования в будущем.
  • Это включает два указанных вами правила. Однако есть и другие случаи, которые вы не укажете. Следовательно, ELSE ??.
  • NOT EXISTSлучше, чем NOT INпо двум причинам. Во-первых, NOT INбудет отфильтровывать все строки, если даже одна строка в подзапросе NULL. Во-вторых, NOT EXISTSдолжен быть быстрее, чем иметь подзапрос агрегации.
MySQL, SQL, вставка, дублирует данные, склад,
Похожие вопросы