0

ここでOracle11gを使用します。

以下のサンプルテーブルに対して特定のクエリを作成する方法を理解しようとしています。

 ID TYPE   PRIORITY    STATUS   DATE
 ----------------------------------------------------
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 2  R      B           NEW      01-OCT-2009
 2  R      B           NEW      01-OCT-2009
 2  R      B           NEW      01-OCT-2009
 2  R      B           NEW      01-OCT-2009
 3  R      A           NEW      01-OCT-2009
 3  Q      A           NEW      01-OCT-2009
 3  Q      A           NEW      01-OCT-2009

これが、クエリに実行させたいことの疑似PL/SQLです。

 SELECT ID, TYPE
 FROM DATA_TABLE
 WHERE ROWNUM = 1 AND STATUS = 'NEW'
 GROUP BY ID, TYPE
 ORDER BY PRIORITY, DATE

IDの次のグループであるTYPEを取得したいのですが、ステータスはNEWで、優先度と日付の順に並べられています。

上記の場合、ステートメントは1Qまたは3Qのいずれかを返す必要がありますが、優先度と日付が同じであるため、両方を返すことはできません。3QがSTATUS='DONE'に設定されている場合、クエリは1Qを返す必要があります。

2番目のステップでは、このデータをテーブルに結合して、処理するセットの行を取得します(例:1Q)。これは2段階のプロセスである必要はありません。結合せずに処理する行のセットを取得できれば、それは理想的です。

本当に単純なものが欠けていることを願っていますが、必要に応じて、パーティション化に分析関数を使用することもできます。

4

1 に答える 1

1
SELECT * FROM (SELECT ID, TYPE FROM DATA_TABLE WHERE STATUS = 'NEW' ORDER BY PRIORITY, DATE) WHERE ROWNUM = 1

それはうまくいくはずです。特定のIDとTYPEに一致する行に対して実際に何らかの集計を実行しようとしているわけではないため、IDとTYPEでグループ化する必要はありません。1つの列(たとえばDATE)だけを気にする場合は、次のように言うことができます。

SELECT ID, TYPE FROM DATA_TABLE WHERE DATE = (SELECT MIN(DATE) FROM DATA_TABLE) AND ROWNUM = 1

テーブル全体を並べ替えることは避けてください。しかし、ここでそれを機能させる方法がわかりません。

于 2009-11-19T19:34:33.193 に答える