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 子句中添加 Fix
和 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')
)
;
我会建议你去 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
有两个原因。首先,即使子查询中有一行是 NULL
,NOT IN
也会过滤掉所有行。其次,NOT EXISTS
应该比聚合子查询更快。
我想知道是否有人可以帮助我。 我已经设法只插入不重复的行
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 子句中添加 Fix
和 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')
)
;
我会建议你去 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
有两个原因。首先,即使子查询中有一行是NULL
,NOT IN
也会过滤掉所有行。其次,NOT EXISTS
应该比聚合子查询更快。