【发布时间】:2012-11-08 17:53:18
【问题描述】:
id device_id config_status update_finished
1 5015001 SUCCESS 11-OCT-2012
2 5015001 SUCCESS 23-OCT-2012
3 5015001 PENDING 23-OCT-2012
4 5015001 PENDING 23-OCT-2012
5 5016222 PENDING 12-OCT-2012
6 5016222 PENDING 22-OCT-2012
嗨,上面是我的表格,上面有一些示例数据。我想要实现的是为每个 device_id 获取最后的 SUCCESS 状态(日期在 update_finished 字段中)和所有 PENDING 状态。从上面的示例中,结果查询应该有:
id device_id config_status update_finished
2 5015001 SUCCESS 23-OCT-2012
3 5015001 PENDING 23-OCT-2012
4 5015001 PENDING 23-OCT-2012
5 5016222 PENDING 12-OCT-2012
6 5016222 PENDING 22-OCT-2012
这意味着只有按日期列 update_finished 的最后一个 SUCCESS 状态以及每个 device_id 的所有 PENDING 状态。
目前我正在尝试使用 GROUP BY:SELECT device_id, config_status, max(update_finished) AS "LastUpdate"
from config_status WHERE config_status = 'SUCCESS' group by device_id, config_status
这确实只返回每个 device_id 的最后一个 SUCCESS 状态,但它错过了 PENDING 状态并且它没有 id 列。如果我将 id 字段添加到 GROUP BY 中,那么无论如何分组将是 id。
谁能帮我正确查询?它也应该有子查询吗?最后我需要将它作为HQL,但我认为它会与SQL非常相似。
编辑:
感谢大家帮助我。所有这些查询都有效,但最适合我@Remigio 提供的查询,因为将其转换为返回参数化对象的 HQL 查询是最简单的,而不仅仅是对象。
这是我在初始示例中省略的附加字段的工作 HQL 查询
List<ConfigStatus> statuses = getHibernateTemplate().find("select c from ConfigStatus c " +
"where (configStatus = 'SUCCESS' and updateFinished = (select max(updateFinished) from " +
"ConfigStatus c1 where c1.device.deviceId = c.device.deviceId and c1.configStatus = 'SUCCESS' and c1.configFile.configFileId = ?)) " +
"or configStatus = 'PENDING' and configFile.configFileId = ?", new Object[] {configFileId, configFileId});
【问题讨论】:
-
了解oracle版本对于利用过分区分析功能很重要。
-
@danihp 你好,Oracle 数据库版本是 10.2
-
很好,我已经引用了 oracle 文档示例和一个版本供您查询。请参阅我的(未经测试的)答案。
-
@danihp 对不起,我的数据库版本错了,实际上是 11