2011-02-08 21 views
2

とインデックス値ごとに1行を選択します。ここでは、行の次のフィールドを持つテーブルの設定で最大列の値

SKU, EVENTSTARTDATE, EVENTENDDATE, PRICE, (...etc...) 

と住宅数千人が(日付はYYMMDD、除外世紀のコードです)例データです:

 
1111111, 101224, 1, 10.99 
1111111, 110208, 110220, 9.99 
1111111, 110301, 110331, 8.99 
2222222, 101112, 101128, 15.99 
2222222, 101201, 110102, 14.99 
etc 

IがSELECT文はすべてのSKUのSKUごとに1行を返す必要があり、特定のSKUやSKUの不完全なサブセットを(単離句は、所望のSELECT文を有することなく最大EVENTSTARTDATEとSKUごとに1行を返すようたいです)。最終的には、開始日が現在の日付以下であり、終了日が現在の日付以上であるという基準を追加したいのですが、最初はどこかで開始する必要があります。 (今だけ最大の日付のために)必要な

例の結果:

 
1111111, 110301, 110331, 8.99 
2222222, 101201, 110102, 14.99 
etc. 
+0

だから、これは書き込み私-SQL-FOR-私のウィンドウを、ドライブアップですか? Otoh、質問の質問をどうやって行うのですか... –

+1

私はそれを行う方法がわからず、SELECTでそれを行う方法を尋ねています。しかし、最終的な実装では、最終的に複数のテーブル、日付範囲の基準、および私自身で実装する必要がある他のものにまたがる結合が必要になります。これは出発点です。私は正確に私の正確なデータをコード化するのではなく、これを一般的に行う方法を知る必要がありますが、サンプルデータを提供せずに私が探しているものを正確に見つけ出すことは困難です。 – VL20

答えて

2

をHAVING追加、あなたは(解析関数のROW_NUMBERを使用することができます)

SELECT * 
FROM (
    SELECT 
     tablename.*, 
     ROW_NUMBER() OVER (PARTITION BY sku 
          ORDER BY eventstartdate DESC) As RowNum 
     FROM tablename) X 
WHERE X.RowNum=1 

、データがありますorder by eventstartdate descの後に番号が付けられているので、1,2,3、...は最新のEventStartDateの1から始まります。 WHERE句は、最新のSKU単位のみをピックアップします。

+0

@ VL20あなたがここで何を言おうとしているかわからない。しかし、RANK()は同じイベントの開始日を持つ複数の行を返すことができますが、ROW_NUMBER()は常に 'rownum = 1'の行を1つ返します。 – RichardTheKiwi

+0

そうです。構文を取得する際に問題が発生し、メインフレームのバージョンのDB2 [RANK()がサポートされている]でサポートされているかどうかわからないため、ROW_NUMBER()を投げた。イベントの開始日が特定のSKU内で一意である場合は、重要ではありません。しかし、ROW_NUMBERは道のりです。訂正されました: "SELECT * FROM(SELECT tablename。*、ROW_NUMBER()OVER(PARTITION BY sku ORDER BY eventstartdate DESC)RowNum FROM tablenameとして)X WHERE X.RowNum = 1"再度、感謝します。 – VL20

1

は、GROUP BYおよびHAVING句を見てください。

select sku, max(eventstartdate) 
FROM TABLE 
group by sku 
having eventstartdate <= sysdate 

編集:各パーティション(SKUのグループ)のためにDB2の最近のバージョンからの文

+0

selectステートメントの残りの部分をキャッチするのは簡単ではないという問題があります。最後のクエリにFROMを入れることを忘れないでください。 – pcofre

+0

編集:最後のクエリにFROMを追加しました – pcofre

+0

@pcofre FROMは間違いなく助けになります。ありがとう。 – jny

0

他のソリューション

select distinct f3.* 
from yourtable f1 
inner join lateral 
     (
     select * from yourtable f2 
     where f1.SKU=f2.SKU 
     order by EVENTSTARTDATE desc, EVENTENDDATE desc 
     fetch first rows only 
     ) f3 on 1=1 
関連する問題