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});