一组三条记录形成一条记录,另一组具有相同数据的记录在SQL中被标识为重复记录
标题表:MarkupAutoTable一组三条记录形成一条记录,另一组具有相同数据的记录在SQL中被标识为重复记录,sql,sql-server,duplicates,Sql,Sql Server,Duplicates,标题表:MarkupAutoTable RecID | Name -------+--------- 1000 | Agent1 1001 | Agent2 1002 | Agent3 行表:MARKUPAUTOLINE RefRecID MARKUPCODE VALUE -------------------------------- 1000 Duty 12 1000 Commission
RecID | Name
-------+---------
1000 | Agent1
1001 | Agent2
1002 | Agent3
行表:MARKUPAUTOLINE
RefRecID MARKUPCODE VALUE
--------------------------------
1000 Duty 12
1000 Commission 5
1000 Freight 7
1001 Duty 12
1001 Commission 5
1001 Freight 7
1002 Duty 4.5
1002 Commission 8.8
在上面显示的表数据中,具有列MARKUPCODE和值的前三条记录与下三条记录完全匹配,顺序为单词1000和1001。因此,我们可以说这三组记录是重复的
我想知道SQL查询来识别这组重复记录。请共享上述场景的SQL查询
提前谢谢
问候,,
达亚卡尔·雷迪
印度海得拉巴
感谢您在SQL Server中使用如下逻辑执行此操作:
select mua1.RefRecID, mua2.RefRecID
from (select mua1.*, count(*) over (partition by mua1.RefRecID) as cnt
from MARKUPAUTOLINE mua1
) mua1 join
(select mua2.*, count(*) over (partition by mua2.RefRecID) as cnt
from MARKUPAUTOLINE mua2
) mua2
on mua1.MARKUPCODE = mua2.MARKUPCODE and
mua1.VALUE = mua2.VALUE and
mua1.cnt = mua2.cnt
mua1.RefRecID < mua2.RefRecID
group by mua1.RefRecID, mua2.RefRecID
having count(*) = mua1.cnt;
这将在表上进行自联接。它统计公共行数,并确保与表的所有行匹配
create or replace function createTab () returns INT as $$
begin
create table MARKUPAUTOLINE (
RefRecID int,
Markupcode varchar,
value int);
return 1;END;$$
Language plpgsql;
创建表:
在表中插入:
选择连续的重复项
我假设插入记录的顺序与refrecid相同,因此refrecid 1000不会在1001之后出现,否则您需要先按refrecid对查询进行排序。查询的流程是这样的,对于每一行,检查refrecid+1或-1以及其他列相等的行,如果是,则返回该行。我希望这有帮助。如果有任何其他限制,请务必告诉我。谢谢您的立即回复。
select * from createTab();
create or replace function insertMark(ref int, mark varchar, value int)
returns void as $$
begin
insert into markupautoline values(ref,mark,value);
END;
$$
language plpgsql;
select insertMark(1000, 'Duty', 12);
select insertMark(1000, 'Commission', 5);
select insertMark(1000, 'Freight', 7);
select insertMark(1001, 'Duty', 12);
select insertMark(1001, 'Commission', 5);
select insertMark(1001, 'Freight', 7);
select insertMark(1002, 'Duty', 4);
select insertMark(1002, 'Commission', 12);
select a.refrecid,a.markupcode,a.value from
(select *,
(select count(*)
from markupautoline a2 where abs(a1.refrecid - a2.refrecid) = 1
and
a1.markupcode = a2.markupcode and a1.value = a2.value) as cnt
from markupautoline a1) a where a.cnt > 0;
refrecid | markupcode | value
----------+------------+-------
1000 | Duty | 12
1000 | Commission | 5
1000 | Freight | 7
1001 | Duty | 12
1001 | Commission | 5
1001 | Freight | 7
(6 rows)