3
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列がありません。idGROUP 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});
4

3 に答える 3

2

このクエリを試すことができます:

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'
于 2012-11-06T09:52:56.563 に答える
1

オラクルのサンプルに基づく:

SELECT last_name FROM 
   (SELECT last_name, ROW_NUMBER() OVER (ORDER BY last_name) R FROM employees)
   WHERE R BETWEEN 51 and 100;

YouTubeのクエリは次のようになります。

select * from (
  SELECT device_id, config_status, update_finished AS "LastUpdate" ,
  ROW_NUMBER() OVER (ORDER BY update_finished desc) R
  from config_status WHERE config_status = 'SUCCESS' 
) where R = 1

編集済み

select device_id, config_status, update_finished
from (
  SELECT device_id, config_status, update_finished  ,
  ROW_NUMBER() OVER (ORDER BY update_finished desc) R
  from config_status WHERE config_status = 'SUCCESS' 
) where R = 1
union all
SELECT device_id, config_status, update_finished  
from config_status WHERE config_status = 'PENDING' 
于 2012-11-06T09:17:46.900 に答える
0
    - これを試して:

    T_CONFIG_STATUSを(
      IDとして1、DEVICE_IDとして5015001、CONFIG_STATUSとして'SUCCESS'、DUAL unionからupdate_finishedとしてTO_DATE('11 -OCT-2012'、' DD-MON-YYYY')を選択します。
      DUALユニオンから2、5015001、'SUCCESS'、TO_DATE('23 -OCT-2012'、' DD-MON-YYYY')を選択します
      DUALユニオンから3、5015001、'PENDING'、TO_DATE('23 -OCT-2012'、' DD-MON-YYYY')を選択します
      デュアルユニオンから4、5015001、'PENDING'、TO_DATE('23 -OCT-2012'、' DD-MON-YYYY')を選択します
      デュアルユニオンから5、5016222、'PENDING'、TO_DATE('12 -OCT-2012'、' DD-MON-YYYY')を選択します
      DUALから6、5016222、'PENDING'、TO_DATE('22 -OCT-2012'、' DD-MON-YYYY')を選択します
    )。
    、q1 as(
      id、DEVICE_ID、CONFIG_STATUS、UPDATE_FINISHED、を選択します
        max(UPDATE_FINISHED)over(DEVICE_IDによるパーティション、CONFIG_STATUS)as MAX_UPDATE_FINISHED    
      T_CONFIG_STATUSから
    )。
    、q2 as(
      id、device_id、config_status、update_finished、max_update_finished、を選択します
        場合
          config_status='SUCCESS'およびupdate_finished=max_update_finishedの場合、'keep'
          config_status ='PENDING'の場合、'keep'
          それ以外の場合は「破棄」
        KEEP_RECORDとして終了
      q1から
    )。
    id、device_id、config_status、update_finishedを選択します
    Q2からKEEP_RECORD='keep'
    IDで注文;

したがって、テーブルt_config_statusは、Skyzerの問題のサンプルデータを含むダミーテーブルにすぎません。

次に、クエリq1は、同じdevice_idとcojnfig_statusを持つすべてのレコードのセット内の各レコードの最大更新日を取得します。

次に、クエリq2は別のフラグを計算して、レコードを保持するか破棄するかを決定します。したがって、PENDINGステータスを持つ各レコードを保持します。ただし、最新の更新終了日を持つSUCCESSステータスのレコードのみが保持されます。

最後のクエリは、フィルターを使用して、フラグ値が「keep」のレコードを表示し、フラグ値が「discard」のレコードを無視します。

これが論理を明確にすることを願っています。

于 2012-11-06T12:07:53.697 に答える