LoginSignup
20
7

More than 1 year has passed since last update.

GROUPBY関数の研究🤔~基本動作確認編~

Last updated at Posted at 2022-12-07

はじめに

すこし複雑なメジャーを記述しようとすると、避けては通れないテーブル操作関数。主要なSUMMARIZEADDCOLUMNSSUMMARIZECOLUMNSなどを研究してみます。

テーブル操作関数シリーズ

続きものです。

  1. SUMMARIZE関数の研究~集計列の追加はなぜ非推奨なのか🤔~
  2. ADDCOLUMNS関数の研究~集計列追加のベストプラクティス🤔~
  3. 集計列追加のベストプラクティス🤔~とはいえ例外だってあるぞ~
  4. SUMMARIZECOLUMNS関数の研究~SUMMARIZE関数は非推奨?🤔~
  5. GROUPBY関数の研究🤔~基本動作確認編~

DAXクエリ&DAX.do

今回の検証はDAX.do上でDAXクエリを書いて検証していきます。
DAXクエリがわからない方は先にこの記事を読んで、DAX.doで少し触ってからのほうが理解が進むでしょう。

DAXクエリについてはこちらの記事を参照してください。

参考記事

GROUPBY関数

文法

GROUPBY ( <Table> [, <GroupBy_ColumnName> [, [<Name>] [, [<Expression>] [, <GroupBy_ColumnName> [, [<Name>] [, [<Expression>] [, … ] ] ] ] ] ] ] )

使ってみる

'SUMMARIZE'関数などと同様最初の引数にはテーブルを指定する必要がある。

EVALUATE
GROUPBY ( 
    'Product',
    'Product'[Category],
    'Product'[Subcategory] 
)

結果

image.png

SUMMARIZE関数でも書ける

EVALUATE
SUMMARIZE ( 
    'Product',
    'Product'[Category],
    'Product'[Subcategory] 
)

結果は同じになる。

image.png

もちろん、SUMMARIZECOLUMNS関数でも同じ結果になります。

集計列の追加

次に集計列の追加をしてみます。
'Product'[Category]列でグループ化をして、それに売上列を追加します。

EVALUATE
GROUPBY (
    'Sales',
    'Product'[Category],
    "SalesAMT", 
    SUMX ( 
        CURRENTGROUP (),
        Sales[Net Price] * Sales[Quantity] )
)
ORDER BY
[SalesAMT] DESC

結果

image.png

CURRENTGROUP() ? 🤔

途中で見慣れぬCURRENTGROUP()という関数がでてきました。これは、GROUPBY関数の現在のグループを表す (サブ) テーブルへのアクセスをします。GROUPBY関数内でのみ使用できます。

SUMMARIZE関数でも書ける

SUMMARIZE関数でも同じことが書けます。ただし、CURRENTGROUP() 関数は使えないので、改めてSUMX関数で集計してあげます。結果は同じ。

EVALUATE
SUMMARIZE (
    'Sales',
    'Product'[Category],
    "SalesAMT", 
    SUMX ( 
        Sales,
        Sales[Net Price] * Sales[Quantity] )
)
ORDER BY
[SalesAMT] DESC

パフォーマンスの違い

DAX Studioで上記のクエリを実行してみると、パフォーマンスの違いがでる。

  • GROUPBY関数
    • 78ms
  • SUMMARIZE関数
    • 16ms

この計算の場合のパフォーマンスはSUMMARIZE関数に軍配が上がる。

image.png

集計列にメジャーを使用する

GROUPBY関数

EVALUATE
GROUPBY (
    'Sales',
    'Product'[Category],
    "SalesAMT", [Sales Amount]
)
ORDER BY
[SalesAMT] DESC

エラーが出る

image.png

GROUPBY関数では集計列の追加にメジャーを指定することはできない😭
CURRENTGROUP ()関数を使用する必要がある。

SUMMARIZE関数

EVALUATE
SUMMARIZE (
    'Sales',
    'Product'[Category],
    "SalesAMT", [Sales Amount]
)
ORDER BY
[SalesAMT] DESC

image.png

こちらは正しい数字がでる。作成済みのメジャーを使用した集計列の追加は可能。

Docsを確認

GROUPBY 関数は、SUMMARIZE 関数に似ています。 ただし、GROUPBYでは、追加する拡張列に対して暗黙的な CALCULATE が実行されません。 GROUPBYでは、追加する拡張列の集計関数内で、新しい関数である CURRENTGROUP()を使用できます。 GROUPBYは、1 つのテーブル スキャンで、複数の集計を実行するために使用されます。

今日のまとめ

グループ化して、簡単な集計列を追加するだけであれば、SUMMARIZE関数の使用が推奨されるようです。既存のメジャーも使えないし、パフォーマンスも劣るからです。
次回記事では、GROUPBY関数の使い所を探ります。

20
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
7