2017-10-19 3 views
0

私は以下の表を持っています。私は、クエリに条件を追加する必要がありますMAX値を適用します。次に、MAX値の行に基づいて条件を追加してください

,MAX(TABLEA.DATE) 
    KEEP (DENSE_RANK LAST ORDER BY TABLEA.DATE) 
    OVER (PARTITION BY ID) 
    AS most_recent_dt 

:私はとき区分= 201 ID毎の

TableAの

ID Date  CategoryID 
1  1/1/17  101 
1  1/2/17  201 
1  1/4/17  201 
1  1/5/17  301 
2  1/1/17  101 
2  5/1/17  201 

(仕事)のクエリID毎の日付のMAX値が必要な場合

:区分コード= 201はその後 MAX

予想される出力を取ります0

ID Date CatergoryId Most_Recent_Dt 
1  1/1/17  101  1/4/17 
1  1/2/17  201  1/4/17 
1  1/4/17  201  1/4/17 
1  1/5/17  301  1/4/17 
2  1/1/17  101  5/1/17 
2  5/1/17  201  5/1/17 

*編集

今、私は私のMAXラインを持っていることを私はMAXラインに基づく条件を追加する必要があります。

期待される出力:

短いですが。

** IDによるパーティション分割。

最大値を適用する際区分=オフMAX値ROWベース201

条件を適用

役割=ゴールドとHistIDは、その後、他の

"承認済み" ヌル

を "保留中" でない場合
ID Date CategoryID Most_Recent_Dt Role HistId Category 
1  1/1/17  101  1/4/17  Gold (Null)  Approved 
1  1/2/17  201  1/4/17  Bronze 201  Approved 
*1  1/4/17  201  1/4/17  Gold  101  Approved 
1  1/5/17  301  1/4/17  Gold  101  Approved 
2  1/1/17  101  5/1/17  Gold (Null)  Pending 
*2  5/1/17  201  5/1/17  Bronze 101  Pending 
+0

あなたは条件が満たされない場合に発生しますか? – APC

+0

良い質問:それから '満たされません'。ケースの式を埋め込むことができるので、条件が満たされていないときに制御できますか? –

+0

私は質問を更新しました –

答えて

0

MAX(CASE When CategoryId = 201 THEN TABLEA.DATE END) 
    OVER (PARTITION BY ID) 
    AS most_recent_201_dt 

今、私は私のMAXラインを持っていることを私はに基づく条件を追加する必要がありますMAXラインのみ。あなたは、最新の日付値のためRoleHistID列の値をしたいとあなたはKEEP句を使用するとき

Case When (Role = Gold And HistId IS NOT NULL) OR() THEN 'Approved' WHEN... THEN 'NotApproved' ELSE 'Pending' END AS Category 

これ

です。

のような何か:

CASE 
WHEN (
    MAX(CASE Role WHEN 'Gold' THEN Role END) 
    KEEP (DENSE_RANK LAST 
      ORDER BY CASE WHEN CategoryId = 201 THEN TABLEA.DATE END NULLS FIRST) 
    OVER (PARTITION BY ID) 
    = Role 
    AND 
    MAX(HistID) 
    KEEP (DENSE_RANK LAST 
      ORDER BY CASE WHEN CategoryId = 201 THEN TABLEA.DATE END NULLS FIRST, 
        CASE Role WHEN 'Gold' THEN Role END NULLS FIRST) 
    OVER (PARTITION BY ID) 
    IS NOT NULL 
) 
OR (...) 
THEN 'Approved' 
WHEN ... 
THEN 'NotApproved' 
ELSE 'Pending' 
END 
+0

ありがとう、いつKeep句を使用するのですか? –

+0

@JoJo私は[ここに説明があります](https://stackoverflow.com/questions/20145952/partition-by-with-and-without-keep-in-oracle/20157109#20157109)ですが、短いバージョンは ' (KEEP'句)でフィルタリングし、次にそれらのカラムの1つ(または別のカラム)から最大値を取得する場合は、KEEPを使用します。 – MT0

+1

間違った 'FIRST' /' LAST'節を付けて 'KEEP'を使って間違えることもできます。あなたがそれを必要としない場合は、それを含めないでください。例えば、 'MAX(col)KEEP(DENSE_RANK FIRST ORDER BY col)'は保持されている値の最大値を取得しますが、保持された値は実際に最小値(最大値ではなく)を返す最小行です。同様に、 'MAX(col)KEEP(DENSE_RANK LAST ORDER BY col DESC)'も最小値を返します(保持された行は今回は降順で並べられます)。 – MT0

0

私はこれを行うだろう:

MAX(CASE WHEN CategoryId = 201 THEN TABLEA.DATE END) OVER (PARTITION BY id) as most_recent_dt 

つまり、これを「最初の値」として考える必要はありません。 idを持つすべてのレコードの(条件)最大値と考えてください。

あなたが(それは MAXと同じであるため) KEEP句は必要ありませんし、ちょうど行うことができます
関連する問題