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"
来自 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});
最佳答案
你可以试试这个查询:
select * from device d
where (config_status='SUCCESS' and update_finished = (select max(update_finished) from
device d1 where d1.device_id = d.device_id and d1.config_status='SUCCESS'))
or config_status='PENDING'
关于java - 坚持使用 sql/hql 查询组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13247774/