メニューボタン
IBMi海外記事2024.01.10

SQLを使用して結果セットを分割する

Mike Larsen 著

先日、あるプロジェクトに取り組んでいた際に、ある品目の属性を取得することが必要になりました。簡単な作業のように思えますが、意外な展開がありました。品目マスター表の内容を見直していたところ、同一品目に対して複数の行があることに気付き、業務上の観点から、それぞれの行が使用され、有効であることが分かりました。

業務面の詳細はさておき、私の目的としては、プログラムでさらに処理するために、その品目の最新版を返すことでした。あれこれ調べて、使えそうな手法をいくつか試した後で、SQL partition by 節が頭に思い浮かび、私の目的に役立つかどうか試してみることにしました。

ここで、品目がどのような状態になっているのか示しておきます(図1)。

図1:品目マスターのデータ

この例では、品目番号(NDC_NUMBER)、品目のケースを表すGTIN、ケース内の数量、およびシーケンス番号があります。この品目の当初のケースのGTIN IDは40300931135566で、ケースは48個入りでした。ある時、その品目のメーカーが、ケース内の数量を72個に変更し、新しいGTIN IDを割り当てました。そして、私のプログラムの目的としては、その品目の最新版を返す必要がありました。

partition by 節を使用して、しばらく試行錯誤した後に、求めていた通りのものが得られるステートメントを書くことができました(図2)。まず、SQLステートメント全体を示してから、コードの部分ごとに見て行きます。

図2:partition byを使用したSQLステートメント

1行目では、共通表式を作成して、結果セットを格納します。魔法が起こるのは3行目から7行目です。3行目では、品目マスター表からNDC、ケースのGTIN、およびケース内の数量を選択します。4行目の Row_number()> 関数は、結果セット内の各行にシーケンス番号を割り当てます。これは後で使用します。 over 節は、 OLAP (オンライン分析処理)操作を実行する結果セットを定義します。次いで、 partition by 節は、結果セットをパーティションに分割するのに使用します。表を分割することで、データを管理および照会しやすくなり、照会のパフォーマンスを向上させることができます。ここでは order by 節を追加して、結果を降順でソートしています。そのようにしたのは、その品目の最新版を取得する必要があったためです。

図3および図4に、このSQLステートメントの結果を示します。

図3:結果セットを表示するSQLステートメント
図4:結果セット

品目に対して2つの行があり、1つ目の行が、その品目の最新版です。最後の手順は、1つ目の行のみを返すように、SQLステートメントに基準を追加することです(図5)。

図5:最終的な結果セットの照会

この照会を実行すると、求めていた行のみが取得されました(図6)。

図6:最終的な結果セット

解決策を構築するときには、課題を解決する多くの選択肢があるのが普通です。ここでは、私の課題を解決するためにこの方法を選びましたが、その課題は、この方法でうまく解決することができました。

あわせて読みたい記事

PAGE TOP