我有一个表格,其中包含字段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个记录,但搜索重复项需要在所有表中。
答案 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)