我正在尝试计算管道特定组件中的项目数。每次它在管道中移动时,都会在此特定表中创建一个条目。
它存储了这样的东西:
ID:int-pk, ObjectId:varchar(25), EventType:int, Time:DateTime
例如。我在看时间 = 10:00
因此,如果对象 1 在上午 9 点有事件 A,在上午 10 点有事件 2,那么我想获得 ObjectId (1)。
特征
- ObjectId 是通过管道的项目的唯一 ID,因此它们实际上很少(1 个条目或每个管道组件,其中大约有 10 个)
- 预计每天约 10K 次插入
- 性能是一个要求(所以 EXISTS(...) 可能不是一个选项)
- 硬件很稳固,它是一台数据中心 SQL 机器,但它与许多其他团队/流程共享。
我遇到的问题/我正在尝试的问题:
- 这是一个设计,所以我没有实际数据。我应该有一个概念证明数据库来测试
- 这是我一直在尝试的一些尝试:
select objectid, time, eventtype
from objects
where -- can't use time < @t because I won't get the later events
group by objectid
having --
或者
select objectid as oid, time, eventtype
from objects
where eventtype = 1
and time < @t
and exists (select objectid, eventtype, time
where objectid = oid -- not sure if this is legal
and eventtype = 2
and time > @t)
正如您可能知道的那样,我没有写很多 SQL,所以我有点忘记了。
例子
ID objectid eventtype time
1 12345 1 09:00 AM
2 12345 2 10:00 AM
eventtypeid description
1 "enter house"
2 "leave house"
3 "enter work"
所以,对象 4 上午 9 点进屋,上午 11 点离开,我想看看他们上午 10 点是否在屋里。12345 是主题的“姓名/编号”
在此示例中,我尝试查询对象是否在上午 10:00 在家中。对象完全有可能进入了房子,但从未离开过,我不希望这些用于此查询。
问题
- 我在正确的轨道上吗?
- 我如何估计第二个查询的预期性能(假设它有效)?
- 指针?建议?例子?
一切都值得赞赏。