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

SQL- selecting between duplicate rows by comparing field values

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

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

我怎么还需要过滤重复的... 我如何通过比较同一 table 中重复行之间的值来 select 一行?

RowID  Action 
 1     Reject
 1     Allow
 2     Allow
 2     Fix

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

谢谢大家的宝贵时间。

如果 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 个选项。这是怎么回事:

选项 1:

将操作列转换为小写值。

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 !

希望对您有所帮助!

我会这样表述:

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 有两个原因。首先,即使子查询中有一行是 NULLNOT IN 也会过滤掉所有行。其次,NOT EXISTS 应该比聚合子查询更快。