【发布时间】:2016-12-04 06:42:18
【问题描述】:
我有一个简单的表格,其中包含“阅读器”对象的状态历史记录。状态可以是 ACTIVE 或 INACTIVE。现在我想要一个查询,它选择在给定时间段内处于活动状态的所有读者。下图显示了我的意思: 带有绿色“生命线”的“读者”在显示期间处于活跃状态;所以它们应该在查询中返回。
表格ReaderActivity 如下所示(仅作为示例,与上图不匹配):
reader_id | state | timestamp
1 | ACTIVE | 1467331201089
2 | ACTIVE | 1467332454545
1 | INACTIVE | 1467348875254
3 | ACTIVE | 1467350416546
1 | ACTIVE | 1467351871123
2 | INACTIVE | 1467352111545
当然,这个reader_id 映射到一个Reader 实体。
我需要对此进行 JPA 查询,但我在将读者纳入结果时遇到了问题,这些结果在该期间(在该期间之前已经处于活动状态)没有“上升沿”(从 INACTIVE 到 ACTIVE 的状态更改)我们调查)。
我基本上也看到了查询的部分内容:
- 首先,选择所有有上升沿的。这很简单:
SELECT DISTINCT a.reader FROM ReaderActivity a WHERE a.timestamp >= :startTimestamp AND a.timestamp < :endTimestamp AND a.state = 'ACTIVE' - 其次,它应该附加到所有阅读器上方的列表中,该列表在周期开始之前具有最后一个状态 ACTIVE。这是我没有得到正确的:我试过(合并到第一个查询中):
SELECT DISTINCT a.reader FROM ReaderActivity a WHERE a.timestamp >= :startTimestamp AND a.timestamp < :endTimestamp AND a.state = 'ACTIVE' or (SELECT aa.reader FROM ReaderActivity aa where aa.reader = a.reader AND aa.timestamp < :startTimestamp AND aa.state = 'ACTIVE' GROUP BY aa.reader ORDER BY max(aa.timestamp)) != null
这也会返回上图中红色标记的阅读器,因为在子查询中使用AND aa.state = 'ACTIVE',我们已经过滤掉了所有的活动状态,所以最后一个当然是活动的。我应该选择开始时间之前的最后一个状态,然后检查它是否处于活动状态。但是怎么做呢?
谁能带我走正确的路? 提前致谢!
【问题讨论】:
标签: java database postgresql jpa