一组三条记录形成一条记录,另一组具有相同数据的记录在SQL中被标识为重复记录

一组三条记录形成一条记录,另一组具有相同数据的记录在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

标题表:MarkupAutoTable

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)