sql显示重复记录的数量

时间:2013-06-25 10:18:10

标签: sql duplicates

我有一个表格,其中包含字段recordid(唯一),createdate,aID,bID,cID

对于存储在字段aID,bID,cID

中的值,还有三个定义表

我想生成一个显示表中所有字段的结果集,另外还有一列显示在过去10分钟内创建了具有相同aID,bID和cID的重复记录的次数。

注意:结果集需要包含对内部连接三个定义表的aID,bID和cID的定义,例如

recordid,createdate,aID,aIDdefinition,bID,bIDdefinition,cID,cIDdefinition,[在过去10分钟内使用相同的aID,bID和cID创建的其他记录数]

最后,select查询只需要带来前X个记录,但搜索重复项需要在所有表中。

2 个答案:

答案 0 :(得分:0)

到“最后10分钟”,我假设您的意思是相对于当前日期/时间而不是相对于手头的记录。此方法使用连接和聚合来获得结果:

select t.aId, t.bId, t.cId, tsum.cnt
from t join
     (select aId, bId, cId, count(*) as cnt
      from t
      where createTime <= CURREENT_TIMESTAMP
      group by aId, bId, cId
     ) tsum
     on t.aId = tsum.aId and t.bId = tsum.bId and t.cid = tsum.cId;

请注意,当前日期/时间的表达式因数据库而异; CURREENT_TIMESTAMP是ANSI标准方法。您还可以使用getdate()(SQL Server),now()(MySQL和Postgres),sysdate(Oracle)或其他内容。

定义将是其他连接,但您甚至不为此提供表的名称。

答案 1 :(得分:0)

我相信它会像这样

SELECT t1.recordid, t1.createdate, t1.aID, t1.bID, t1.cID, isnull(tcount.numberOfRecords10min,0), definitionTable1.aIDdefinition
  FROM t1
    LEFT OUTER JOIN (
      SELECT aID,bID,cID,count(*) as numberOfRecords10min
      FROM t1
      WHERE createdate >= dateadd(minute, -10, GETDATE())
      GROUP BY aID,bID,cID
    ) tcount on (t1.aID = tcount.aID and t1.bID = tcount.bID and t1.cID = tcount.bID)
    LEFT OUTER JOIN definitionTable1 on t1.aID = definitionTable1.aID

假设包含记录列表的表名为t1,而包含aID定义的表格为definitionTable1

代码适用于SQL Server,如果您使用其他DBMS,则需要替换dateadd(minute, -10, GETDATE())以获取前10分钟的时间戳,并isnull(tcount.numberOfRecords10min,0)来消除空值(替换为0)