複数グループの中にある先頭行を取得したい

メモ:  Category:oracle

グループ化されたレコードの中から。先頭の行だけを出力したいことがたまにあります。

そんな時に使用できるのが、分析系の partition by になります。

partition by

例えば、次のテーブルがあるとします。

基データ

この中から製品がどこの作業にあるのかを知りたいとすると、次のような結果が欲しくなります。

グループ毎の先頭を抽出

欲しい結果は、製品Aの未作業のうち最も oeration_order が小さい作業2と製品Bの未作業のうち最も oeration_order が小さい作業3になります。

そこで、 partition by を使ってグループごとに処理が行われるようにしてみます。

SELECT 
     name
    ,operation_order
    ,operation
    ,progress
    ,ROW_NUMBER()
         ORVER(PARTITION BY name ORDER BY operation_order ) row_num
FROM sample
WHERE progress IS NULL;

上記SQL文を実行すると PARTITION BY で指定したグループごとに処理されます。この場合、 name のグループ単位に行番号が振られ次のような結果が得られます。

グループ毎の行番号設定

今回ほしい結果は、「グループ化されたレコードの中から先頭の行だけを出力したい」という事でしたので、先頭行だけ抽出するよう条件を追加します。

SELECT *
FROM
    (
    SELECT 
         name
        ,operation_order
        ,operation
        ,progress
        ,ROW_NUMBER()
             ORVER(PARTITION BY name ORDER BY operation_order ) row_num
    FROM sample
    WHERE progress IS NULL
    )
WHERE row_num = 1;
グループ毎の先頭を抽出

以上でほしい結果が得られるようになりました。

bluenote by BBB