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狀態。從結果查詢上面的例子應該有:堅持與sql/hql查詢組
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日期列每個DEVICE_ID所有懸而未決的狀態只有最後一個SUCCESS狀態和。
目前我正在試圖亂用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,但它忽略掛起的狀態和它沒有id
列。如果我將id
字段添加到GROUP BY,那麼無論如何分組將是id
。
任何人都可以幫助我正確的查詢嗎?它應該有子查詢嗎?最後,我需要把它作爲HQL,但我認爲它會非常類似於SQL。
編輯:
謝謝大家對我的幫助了。所有這些查詢都能正常工作,但大部分都符合@Remigio提供的查詢,因爲最容易將其轉換爲HQL查詢,該查詢返回參數化對象,而不僅僅是Object。
這是我與其他字段的工作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
@danihp嗨,Oracle數據庫版本是10.2 – Skyzer
不錯,我引用了oracle文檔樣本和一個適合您查詢的版本。看我的(未測試)答案。 – danihp