BYで二郎の地域グループ境界を知るどうも、PostgreSQL推進委員会のアフロ・ナミヘイです。前回はラーメン二郎の売り上げデータを、地域別のグループに分けてランキングを出したいというケースを紹介しました。今回も同様に以下のラーメン二郎各店舗における年月ごとの売上データを扱います。4000000今回は、さらに取得した売上データをラーメン二郎の店舗が属する地域別にファイルに出力したいというケースを考えてみたいと思います。現場でも一括して取得した大量のデータを、店舗や地域といった要素でファイルを分けて出力したい、といったケース、あると思います。この場合に苦労する要因が、データを1行ずつループで見ていく際に、どこで地域が変わるのか?そして地域が変わることで、今書き込んでいるファイルをクローズして新しい地域のファイルを作らなければならないのか?ということが次のレコードを見るまでわからないという点です。大量データで1行ずつフェッチしてレコードを見ていく場合、次のレコードの値は次のループに進まなければわからないので、今処理したレコードの地域を一時変数に保持しておいて、次のレコードを取り出して地域を比較して~、という面倒な処理が必要になってしまいます。具体的には、以下のようなコードのイメージです。)になるといったケースもあると思います。すると比較に使用する一時変数も増え、さらに煩雑なロジックになります。テストを行えばバグは防げるでしょうが、設計~テスト工程までにかかる労力は馬鹿になりません。BYを応用すればこの負担を劇的に減らすことができます。BYは、グループ分けをしますが集約はしない、そのため、グループ内で各レコードに順位をつけることができるということでした。順位がわかるということは、グループ内のレコード数もわかるということです。これが二郎の地域グループの境界を教えてくれます。それでは実際のSQLを見てみましょう。3これで二郎の地域グループごとのレコード件数を、各レコードに持つことができました。23区西なら二郎は4店舗、多摩なら3店舗というようにです。=地域別レコード数」であれば地域グループの境界と判断することができます。リスト3の結果でいうと、荻窪店が23区西グループの最終レコードであり、立川店が多摩地区の最終レコードだということが「地域別売上順位=地域別レコード数」により判断できます。これにより、リスト2のコードは以下のように変えられます。}}煩わしい一時変数が消え、今処理しているレコードの情報だけで境界が判断できるようになりました。BY、ぜひ活用されてみてください。※文中の実行環境はPostgreSQL9.6を使用しています。最新の記事アフロ・ナミヘイPostgreSQL推進委員長。アンチOracle派筆頭。標準SQLに反する書式は許しません。(+)とか使ってると激おこ。POSTS大転職博【東京】1月31日に参加します。様ホームページをリニューアルいたしました。