ダッシュボードやワークシートでのクエリ結果のフィルタリング

ダッシュボードおよびSQLワークシートでは、Snowflakeのすべてのロールが使用できるシステムフィルター、または管理者が作成したカスタムフィルターを使用して、クエリ結果をフィルタリングできます。

カスタムフィルターの作成

カスタムフィルターを使用すると、クエリを直接編集せずに、クエリの結果を変更できます。

フィルターは、クエリの実行で使用されるサブクエリまたは値のリストとして解決される、特別なキーワードとして実装されます。そのため、SQLクエリでフィルターを使用する場合、いくつかの制限があります。 SQLクエリでフィルターを指定する をご参照ください。

注釈

カスタムフィルターは作成後、アカウント内の誰でも表示・使用することができます。カスタムフィルターには関連するロールがありますが、そのロールはフィルターの可視性を制限するものではありません。

カスタムフィルターを作成するための権限の付与

ユーザがカスタムフィルターを作成するには、ACCOUNTADMINロールを持つユーザーが、そのユーザーに付与されたロールに関連する権限を付与する必要があります。 Snowsight、カスタムフィルターを作成する権限をロールに付与する場合にのみ使用できます。

アカウントのカスタムフィルターを作成する権限をロールに付与するには、次の操作を実行します。

  1. Snowsight にサインインします。

  2. ワークシートのリストを開いてワークシートを開くには Projects » Worksheets を選択し、ダッシュボードのリストを開いてダッシュボードを開くには Projects » Dashboards を選択します。

  3. フィルターを表示するまたは非表示にする を選択し、ワークシートの場合は Manage Filters を選択します。

  4. 表示されるダイアログで、 Edit Permission を選択します。

  5. Filter Permissions ダイアログで、フィルターを作成する機能を付与するロールを選択します。

  6. Save を選択します。

カスタムフィルターを作成する

フィルターを作成するには Snowsight、カスタムフィルターを作成するには権限を持つロールを使用する必要があります。

カスタムフィルターを作成するには、次の操作を実行します。

  1. Snowsight にサインインします。

  2. ワークシートのリストを開いてワークシートを開くには Projects » Worksheets を選択し、ダッシュボードのリストを開いてダッシュボードを開くには Projects » Dashboards を選択します。

  3. フィルターを表示するまたは非表示にする を選択し、ワークシートの場合は Manage Filters を選択します。

  4. 表示される Filters ダイアログで、 + Filter を選択します。

  5. フィルターを追加するには、次を完了します。

    1. Display Name には、フィルターの名前を入力します。ワークシートまたはダッシュボードでフィルターを選択すると、この名前がフィルターに表示されます。

    2. SQL Keyword の場合、クエリに挿入する一意のキーワードを入力します。スペースを入れずに、フォーマット :<文字列> を使用してください。例: :page_path

    3. Description には、フィルターの説明を入力します。

    4. Role では、フィルターに関連付けるロールを選択し、フィルターがクエリに基づいている場合は、フィルター値の入力に使用するクエリを実行します。ドロップダウンリストには、カスタムフィルターを作成する権限を持つロールだけが表示されます。詳細については、 カスタムフィルターの所有権を管理する をご参照ください。

    5. Warehouse では、フィルターがクエリに基づいている場合、フィルター値をリフレッシュするために使用するウェアハウスを選択します。フィルターの所有者ロールは、選択したウェアハウスで USAGE 権限を持っている必要があります。これらのステップの一部としてクエリを実行して検証する場合は、ウェアハウスが稼動している必要があります。

    6. Options via では、フィルター値をクエリで入力するか、リストで入力するかを選択します。

      • Query を選択した場合は、 Write Query を選択し、 フィルターに入力するクエリを書く を参照してフィルタークエリを作成してください。

      • List を選択した場合は、次のようにしてください:

        1. Edit List を選択します。

        2. オプションで、 Name の場合、リスト項目の名前を入力します。フィルターのドロップダウンリストに名前が表示されます。名前を入力しない場合は、 Value が使用されます。

        3. Value には、フィルターで使用する列名の値を入力します。

        4. リストが完成するまで名前と値のペアを追加し続け、 Save を選択します。

  6. Add Filter ダイアログの Value Type で、リスト項目が TextNumber のどちらのタイプのデータであるかを選択します。

  7. フィルタオプションのドロップダウンリストで複数の項目を選択できるようにするには、 Multiple values can be selected のトグルをオンにします。

  8. ユーザーが列のすべてのアイテムの結果を見ることができるようにする場合は、 Include an "All" option のトグルをオンにして、 All オプションをどのように機能させるかを選択します。

    • Any value を選択すると、フィルターの All は、フィルターが適用される列が、フィルターリストに値が存在するか否かにかかわらず、結果にどのような値を持っていてもよいことを意味します。

    • Any value in list of options を選択すると、フィルター内の All は、フィルターが適用される列がフィルターリスト内の任意の項目を含むことを意味します。

  9. フィルターで指定されていない項目の結果をユーザーに表示させたい場合は、 Include an "Other" option のトグルをオンにします。

  10. Save を選択します。

  11. Filters ダイアログを閉じるには、 Done を選択します。

フィルターに入力するクエリを書く

クエリからフィルターオプションのリストを作成するには、クエリが特定のガイドラインに従っている必要があります。

  • namevalue を返す必要があります。

  • オプションの列 description を返すことができます。

  • 他の列を返すこともできますが、それらはドロップダウンフィルターリストには表示されません。

フィルタは一度に1つのクエリしか実行できません。例えば、 name 列を返すクエリと、 value 列を返す2番目のクエリを実行するなど、フィルターオプションのリストを生成するために複数のクエリを実行することはできません。

注釈

フィルターオプションのリストを入力するために使用されるクエリは、フィルターを作成した(または最後に変更した)ユーザーとして実行されます。カスタムフィルターを作成すると、アカウント内の誰でも表示および使用できるようになるため、クエリによって生成されるフィルターオプションのリストに保護されたデータや機密データが含まれていないことを確認してください。

フィルタークエリを作成し、 New filter ダイアログに追加したら、次のようにしてクエリフィルターの設定を完了します。

  1. Done を選択すると、フィルタークエリが保存され、 Add Filter ダイアログに戻ります。

  2. オプションで、デフォルトのリフレッシュオプションを Refresh hourly から Never refresh または Refresh daily に変更します。フィルターリフレッシュオプションの詳細と注意事項については、 カスタムフィルターのリフレッシュ頻度を管理する をご参照ください。

  3. カスタムフィルターの作成手順に戻り、フィルターの作成を完了します。 カスタムフィルターを作成する をご参照ください。

アカウント内のカスタムフィルターをレビューおよび管理する

アカウントのカスタムフィルターを確認するには、ワークシートまたはダッシュボードを開き、 フィルターを表示するまたは非表示にする を選択します。

カスタムフィルターリストの入力に使用されるクエリのリフレッシュ頻度の変更など、フィルターに変更を加えるには、ACCOUNTADMIN ロールまたは フィルターを管理する権限 を持つロールを持っている必要があります。 カスタムフィルターのリフレッシュ頻度を管理する をご参照ください。

カスタムフィルターの所有権を管理する

各カスタムフィルターには関連するロールがあります。そのロールを持つ人は誰でもフィルターを編集または削除することができます。ACCOUNTADMINロールを持つユーザーは、アカウント内のすべてのフィルタを表示および編集できます。

フィルタに関連付けられたロールが削除された場合、フィルターのロールを削除したロールはカスタムフィルターの所有権を継承 しません。代わりに、ACCOUNTADMINロールを持つユーザがフィルターを編集し、フィルターに関連付けられたロールを変更することができます。

カスタムフィルターのリフレッシュ頻度を管理する

SQLクエリによって入力されるカスタムフィルターにもリフレッシュ頻度があります。リフレッシュ頻度は、1時間ごと、毎日、または一度もリフレッシュしません。

フィルタは、保存された時刻と、フィルターオプションをリフレッシュするクエリの実行にかかった時間に基づいて実行されます。

たとえば、1時間ごとのクエリリフレッシュ頻度が10:07 AMであるフィルターを保存した場合、最初のリフレッシュクエリは11:07 AM以降に実行されます。多数のフィルターリフレッシュクエリが同時に実行されるようにスケジュールされた場合、クエリはキューに入れられ、同時に実行されるフィルターリフレッシュクエリの数を制限します。次のフィルターリフレッシュは、最後のリフレッシュがいつ完了したかに基づいて行われます。この例では、11:07 AMのクエリリフレッシュに20分かかる場合、次のリフレッシュクエリは12:27 PM以降に実行されます。

フィルターのリフレッシュは、フィルターを作成または最後に変更したユーザーとして実行され、 Queries executed by user tasks のタイプの1つとして Query History に表示されます。 Query History の使用に関する詳細については、 クエリ履歴でクエリのアクティビティをモニターする をご参照ください。

どのフィルターがフィルタークエリのリフレッシュの原因かを判断するには、フィルターのリストを開き、各フィルターを開いて詳細を表示する必要があります。

フィルタークエリのリフレッシュに失敗した場合のトラブルシューティング

フィルタークエリのリフレッシュは、以下のいずれかの理由で失敗することがあります。

  • フィルターを作成または最後に変更したユーザーは、Snowflakeで削除されたか無効になっています。

  • このユーザーは3ヶ月間サインインしていないため、非アクティブです。

どのユーザーがフィルターを作成したか、または最後に変更したかを確認することはできません。リフレッシュに失敗するフィルターがある場合、WORKSHEETS_APP_USER ユーザーによる認証試行が成功した後に、共有 SNOWFLAKE データベースの ACCOUNT_USAGE スキーマの LOGIN_HISTORY ビュー ビューのユーザーによる認証試行が失敗したことが表示されることがあります。

例えば、OAuthアクセストークンを使用したログインアクティビティを過去2日間に遡って特定するには、以下のクエリを使用します。

SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.LOGIN_HISTORY
WHERE
    FIRST_AUTHENTICATION_FACTOR = 'OAUTH_ACCESS_TOKEN'
    AND
    REPORTED_CLIENT_TYPE = 'SNOWFLAKE_UI'
    AND
    EVENT_TIMESTAMP > DATEADD('DAY', -2, CURRENT_DATE());
ORDER BY
    EVENT_TIMESTAMP DESC;
Copy

失敗したクエリのリフレッシュ頻度に関連する認証の試行は、カスタムフィルターのリフレッシュ頻度に応じて、毎日または毎時の同じ時刻に発生します。

SQLクエリでフィルターを指定する

システムフィルター またはカスタムフィルターをSQLクエリで使用できます。ストアドプロシージャまたはユーザー定義関数(UDF)ではフィルターを使用できません。

SQLクエリにフィルターを追加するには、次のいずれかの形式を使用します。

  • SELECT :<filter_name>(<col_name>) のように、SELECT ステートメントの一部としてフィルターを指定します。

  • 等号を比較対象としてフィルターを指定します。例:

    • WHERE <col_name> = :<filter_name>

    • WHERE <:filter_name> = <col_name>

    • <value_a>:<value_b>::string = <:filter_name>

フィルターのコンパレータとして使用できるのは等号のみで、 LIKE または CONTAINS を使ったフィルターは使用できません。

フィルターが適用される列もまた、フィルターが期待する値型と一致しなければなりません:

  • カスタムフィルターセットで値の型がtextの場合、列はtext文字列であるか、クエリでtext文字列にキャストする必要があります。 テキスト文字列のデータ型 をご参照ください。

  • カスタムフィルターセットで数値型を使用するには、列が数値データ型でなければなりません。 数値データ型 をご参照ください。

  • システムフィルターの場合、列はTIMESTAMPデータ型でなければなりません。 日付と時刻のデータ型 をご参照ください。

SQLクエリにフィルターを追加し、ドロップダウンリストを使用してフィルターオプションを選択すると、クエリのSQL構文が変更されます。リスト内の異なるオプションを選択した場合に、 SQL の構文がどのように変更されるかについては、以下の表をご参照ください。

SQLリファレンスをフィルターする

選択されたフィルターオプション

使用するSQL

リスト項目

<col> = <list_item>

複数のリスト項目を選択

<col> IN (<list_item>, <list_item>)

すべて、 Any value が指定されています

true

すべて、 Any value in list of options が指定されています

<col> IN (<list_item>, <list_item>, ... )

その他

<col> NOT IN(<list_item>, <list_item>, ... )

フィルターの適用と保存

フィルターで選択したオプションを変更すると、変更を適用するオプションが表示されます。 Apply を選択すると、ワークシートまたはダッシュボードが実行され、更新されたフィルター結果が表示されます。

ダッシュボードのフィルターに変更を適用すると、変更を保存するオプションが表示されます。 Save を選択すると、ダッシュボードに加えた変更が保存され、ダッシュボードの他のユーザーが利用できるようになります。

例えば、 All Time からの結果を見るためにフィルターを変更するために Apply を選択するかもしれませんが、次に誰かがダッシュボードを開いたときに、そのような大量のデータをダッシュボードで実行したくないため、 Save を選択 しません。全時間にわたってダッシュボードを実行した後、日付範囲フィルターを Last 7 days に変更し、 Apply を選択してダッシュボードを実行し、 Save を選択してダッシュボードユーザー用のデフォルトフィルター値を保存します。

Snowsightシステムフィルター

次のシステムフィルターは、すべてのロールで使用できます。

  • :daterange

    • Last dayLast 7 daysLast 28 daysLast 3 monthsLast 6 monthsLast 12 monthsAll time、またはカスタム日付範囲のように、日付範囲で列をフィルタリングします。

      注釈

      日付範囲フィルターは常に UTC タイムゾーンを使用し、 TIMESTAMP_INPUT_FORMAT パラメーターの影響を受けません。

      デフォルトは Last day です。

  • :datebucket

    • SecondMinuteHourDayWeekMonthQuarterYear のように、期間ごとにデータを集計します。

      デフォルトは Day です。

これらのフィルターは編集したり削除したりすることはできません。

例:日付フィルターの操作

たとえば、SNOWFLAKE_SAMPLE_DATAデータベースおよびTPCH_SF 1 スキーマのORDERSテーブルのような注文データを持つテーブルがある場合、テーブルをクエリし、結果を日ごとや週ごとなど特定の時間バケットでグループ化し、結果を取得する特定の日付範囲を指定したい場合があります。

そのためには、次のようにクエリを書きます。

SELECT
    COUNT(O_ORDERDATE) as orders,
    :datebucket(O_ORDERDATE) as bucket
FROM
    SNOWFLAKE_SAMPLE_DATA.TPCH_SF1.ORDERS
WHERE
    O_ORDERDATE = :daterange
GROUP BY
    :datebucket(O_ORDERDATE)
ORDER BY
    bucket;
Copy

この例では、

  • 注文数を数え、ORDERSテーブルから注文日の詳細を取得します。

  • WHERE 句に :daterange システムフィルターを含めることで、特定の日付範囲で結果をフィルタリングできます。

  • GROUP BY 句に :datebucket システムフィルターを含めることで、結果を特定の期間でグループ化できます。

  • ORDERBY句を含めることで、結果を期間の古いものから新しいものへと並べ替えます。

クエリにフィルターを追加すると、ワークシートまたはダッシュボードの上部に対応するフィルターボタンが表示されます。

フィルターボタンが表示される場合、タブオーダーのフィルターの表示および非表示ボタンの後に表示されます。

クエリの結果を操作するには、フィルターを使用して特定の値を選択します。

この例では、 Group by フィルター(日付バケットフィルターに対応)を Day でグループ化するように設定します。日付範囲フィルターに相当するもう一方のフィルターを、 All time に設定します。

Apply を選択し、検索結果にフィルターを適用すると、検索結果が日ごとにグループ化され、以下のような結果が表示されます。

+--------+------------+
| orders |  buckets   |
+--------+------------+
|    621 | 1992-01-01 |
|    612 | 1992-01-02 |
|    598 | 1992-01-03 |
|    670 | 1992-01-04 |
+--------+------------+

異なる日付のバケットを選択することで、異なるデータのグループを表示することができます。例えば、週単位の注文データを表示するには、 Group by フィルターを Week に設定し、 Apply を選択します。以下のような結果が出力されます。

+--------+------------+
| orders |  buckets   |
+--------+------------+
|   3142 | 1991-12-30 |
|   4404 | 1992-01-06 |
|   4306 | 1992-01-13 |
|   4284 | 1992-01-20 |
+--------+------------+