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ステータスのみを意味します。
現在、GROUPBYをいじろうとしています。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});