SQL-通过比较字段值在重复行之间进行选择

时间:2017-10-29 10:12:20

标签: mysql sql insert duplicates data-warehouse

我想知道是否有人可以帮助我。 我已经设法只插入不重复的行

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

在这种情况下,我只需要插入第一行(reject + allow = Reject)和最后一行(Allow + Fix = Fix)。

谢谢大家的时间。

2 个答案:

答案 0 :(得分: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 INNULL将过滤掉所有行。其次,NOT EXISTS应该比拥有聚合子查询更快。

答案 1 :(得分: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')
)
;

修改

我在评论中提到了两个选项。它是如何发展的:

选项1:

将Action列转换为小写值。

Update DQLog set Action = Lower(Action);

以上查询将以小写字母转换Action的所有值。现在您可以运行以下查询并完成:

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')
)
;

因此,您的任务已完成,您的冗余数据也已修复。

Option 2:

只需在我的主查询的where子句中添加FixReject的所有可能变体,如下所示:

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')
)
;

我建议你去Option 1

希望它有所帮助!