0

我有一个包含字段 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 的附加记录数]

最后,选择查询只需要带前 X 条记录,但重复搜索需要在所有表中。

4

2 回答 2

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)

于 2013-06-25T10:54:19.077 回答
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) 或其他东西。

定义将是额外的连接,但您甚至没有为此提供表的名称。

于 2013-06-25T10:32:48.247 回答