我有一个简单的表,其中包含“阅读器”对象的状态历史记录。状态可以是活动的或不活动的。现在,我想查询一个查询,该查询选择在给定时间段内处于活动状态的所有读者。下图显示了我的意思:带有绿色“生命线”的“阅读器”在所显示的时间段内处于活动状态;因此它们应在查询中返回。
表格ReaderActivity
看起来像这样(仅示例,与上面的图片不匹配):
reader_id | state | timestamp
1 | ACTIVE | 1467331201089
2 | ACTIVE | 1467332454545
1 | INACTIVE | 1467348875254
3 | ACTIVE | 1467350416546
1 | ACTIVE | 1467351871123
2 | INACTIVE | 1467352111545
当然,有一个Reader
实体要reader_id
映射到该实体。
我需要对此进行JPA查询,但是我遇到了一些问题,包括读者对结果的了解,这些问题在这段时间内(在我们研究的这段时期之前就已经处于活动状态)没有“上升沿”(状态从INACTIVE变为ACTIVE) )。
我基本上看到了查询的一部分:
SELECT DISTINCT a.reader FROM ReaderActivity a WHERE a.timestamp >= :startTimestamp AND a.timestamp < :endTimestamp AND a.state = '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'
在子查询中,我们已经过滤掉了所有ACTIVE状态,因此最后一个当然是ACTIVE。我应该选择开始时间之前的最后一个状态,然后再检查是否处于活动状态。但是如何?
有人可以带我走正确的路吗?提前致谢!
查询的第一部分将带回其记录在您需要的时间段内变为活动状态的记录。查询的第二部分需要一些改进。
为了执行您要的操作,您将必须为每个reader_id调回最新的状态更改,直到“ startTimeStamp”时刻为止。然后,您可以从这些文件中选择当时被列为“ ACTIVE”的文件。
就像是..
Select a.reader_id
From ReaderActivity a
Where a.timeStamp in
(
Select max(b.timeStamp)
From ReaderActivity b
Where b.timestamp < :startTimeStamp
And b.reader_id = a.reader_id
Group By b.reader_id
)
and a.state = "ACTIVE"
该查询将返回在指定时间段开始时处于活动状态的所有[reader_id]。您可以在原始查询的where子句中运行此代码,也可以使用UNION将其附加到查询的末尾,然后对整个混乱运行Select Distinct(reader_id)。
从表中的组的最大值中进行选择对我来说总是很古怪的。但我希望此查询对您有所帮助!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句