スノーフレーク SQL 集約関数とテーブル結合

スノーフレーク SQL 集約関数とテーブル結合

  • オーケストレーション
6分で読めます 更新日 Oct 7, 2020

ポイント: スノーフレーク SQL 集約関数は、行にわたって計算を実行し、カウントや統計分析を含み、テーブル結合は複数のテーブルからデータを組み合わせます。stddev_pop()やlistagg()のような主要な関数は、データの要約と整理を強化します。

  • 集約関数は、指定された行にわたって値を計算します。
  • テーブルを結合することで、データの取得を組み合わせることができます。
  • 統計関数は、平均と偏差を計算します。

この記事では、スノーフレークで集約関数を使用する方法を説明します。

集約関数とは何ですか?

集約関数は、テーブル内のすべての行または行のサブセットに対して計算を実行する関数です。

例えば、最も簡単な集約関数はcount()です。グループやWHERE句なしでcount(*)を使用して、テーブル内のすべての顧客をカウントできます。*はスノーフレークにすべての列を確認するよう指示しますが、1つの列を指定しても同じ意味です。

    select count(*) from orders

しかし、特定のサブセットで注文をカウントしたい場合、例えば注文タイプごとに顧客をカウントすることができます:

    select ordertype, count(*) from orders
group by ordertype;

サンプルデータを作成する

これらの関数を探求するために、サンプルデータを作成しましょう。スノーフレークにログインし、データベースを作成ボタンをクリックしてinventoryというデータベースを作成します。次に、ワークシートエディタを開き、次の2つのSQLコマンドを貼り付けます:

    CREATE TABLE customers
  ( 
     customernumber     varchar(100) PRIMARY KEY, 
    customername varchar(50),
    phonenumber varchar(50),
    postalcode varchar(50),
    locale varchar(10),
    datecreated date,
    email varchar(50)
  );


CREATE TABLE orders
  ( 
     customernumber     varchar(100) PRIMARY KEY,
    ordernumber varchar(100),
    comments varchar(200),
    orderdate date,
    ordertype varchar(10),
    shipdate date,
discount number,
quantity int,
    productnumber varchar(50)
)

次に、このデータを貼り付けます。データは次のようになります:

    insert into customers (customernumber,customername,phonenumber,postalcode,locale,datecreated,email) values ('ee56d97a-fcaa-11ea-ab7a-0ec120e133fc','zopvxqhwocrtsonemrcf','3119110','vqlx','','2020-09-22','[email protected]');

insert into orders (customernumber,ordernumber,comments,orderdate,ordertype,shipdate,discount,quantity,productnumber) values ('ee56d97a-fcaa-11ea-ab7a-0ec120e133fc','ee56d97b-fcaa-11ea-ab7a-0ec120e133fc','shsyuaraxxftdzooafbg','2020-09-22','sale','2020-10-01','0.7751890540939359','40','ee56d97c-fcaa-11ea-ab7a-0ec120e133fc');

テーブルの結合

顧客と注文のテーブルは、注文番号で結びついています。顧客および注文データを一緒に必要なときは、これらを1つのセットにまとめる必要があります。これを結合を使用して一時的に作成します。

顧客番号の列要素で2つのテーブルを結合します。注意してください:

  • asを使用して、テーブル名を省略するエイリアスを作成し、入力を簡素化します。
  • inner joinの代わりにjoinを使用します。(他のチュートリアルではしばしばinner joinを追加しますが、それは同じことなので混乱を招くだけです。左結合、右結合、または外部結合と対比するために書くこともありますが、それは直積のようなもので、すなわちn個の注文をm人の顧客に付加してn*m行のセットを作成します。)
    select c.customernumber, c.customername, o.ordernumber,  c.datecreated, o.orderdate,  o.shipdate from customers as c
join orders as o on c.customernumber = o.customernumber;

標準偏差

出荷時間の標準偏差を計算しましょう。これを3つのステップで行います:

  1. 顧客と注文テーブルを結合します
  2. datediff() 関数を使用して出荷時間を計算します。つまり、顧客が待たなければならない時間です。
  3. 各外側のクエリは、内部のクエリを括弧[()]でラップして参照します。したがって、クエリは段階的に構築されます。

以下が完全なクエリです。どのように分解されているかは下に示します。

    select
  avg(shiptime),
  stddev_pop(shiptime)
from
  (
    select
      customernumber,
      customername,
      orderdate,
      shipdate,
      datediff(days, orderdate, shipdate) as shiptime
    from
      (
        select
          c.customernumber,
          c.customername,
          o.ordernumber,
          c.datecreated,
          o.orderdate,
          o.shipdate
        from
          customers as c
          join orders as o on c.customernumber = o.customernumber
      )
    order by
      shiptime desc
  )

私たちは段階的にクエリを構築します。下のクエリ(最も内側のクエリ)から始めて、上に向かって作業します:

  1. 顧客と注文テーブルを結合し、顧客と注文の詳細を1つのセットでリストできるようにします。(注文テーブルのみを使用しているので、このステップを省略することもできます。)
    (
  select
    c.customernumber,
    c.customername,
    o.ordernumber,
    c.datecreated,
    o.orderdate,
    o.shipdate
  from
    customers as c
    join orders as o on c.customernumber = o.customernumber
)
  1. datediff()関数を使用して出荷時間を計算します
    select
  count(*),
  datediff(days, orderdate, shipdate) as shiptime
from
  orders
group by
  shiptime
order by
  shiptime
  1. 出荷時間の標準偏差を計算します:
    select avg(shiptime), stddev_pop(shiptime) from (step b)

こちらが結果です:

こちらが結果です:

こちらが結果です:

    AVG(SHIPTIME)	STDDEV_POP(SHIPTIME)
8.539063	3.512038155

離散パーセンタイル

95パーセンタイルは、人口の95%を示すことを意味します。これは一般的な統計であり、その範囲外のデータは通常、外れ値と見なされます。

ここでは、25パーセンタイルを計算する方法を示します:

結果は:

    select customernumber ,  PERCENTILE_disc( 0.25 ) within group (order by quantity)
from orders
  where customernumber = '5d2b742e-fcaa-11ea-ab7a-0ec120e133fc'
  group by customernumber
  order by customernumber

結果は:

    CUSTOMERNUMBER	PERCENTILE_DISC( 0.25 ) WITHIN GROUP (ORDER BY QUANTITY)
5d2b742e-fcaa-11ea-ab7a-0ec120e133fc	9

確認すると、注文数量は92、55、9であることがわかります。したがって、下位25%に該当するのは9だけです。

    select quantity from orders
where customernumber = '5d2b742e-fcaa-11ea-ab7a-0ec120e133fc'
order by quantity desc;

こちらが結果です:

    QUANTITY
92
55
9

listagg

listagg関数は、顧客ごとに注文を配列としてリストし、要素のリストを要求するWHERE句で使用できる別の形式に変換します。

    select listagg(ordernumber, '|')   
from orders
where customernumber = '5d2b742e-fcaa-11ea-ab7a-0ec120e133fc'

こちらが結果です:

    LISTAGG(ORDERNUMBER, '|')
5d2b742f-fcaa-11ea-ab7a-0ec120e133fc|5d2b7431-fcaa-11ea-ab7a-0ec120e133fc|5d2b7433-fcaa-11ea-ab7a-0ec120e133fc

クエリを実行する際は、他のクエリと照合して作業を再確認する必要があります。ここでは、顧客番号を上下に列挙しています。

    select orderumber from orders
where where customernumber = '5d2b742e-fcaa-11ea-ab7a-0ec120e133fc'

mode

mode()関数は、最も頻繁に出現する値を示します:

結果は:

    select mode(quantity)   
from orders

結果は:

    MODE(QUANTITY)
13

これらの投稿は私自身のものであり、必ずしもBMCの立場、戦略、または意見を表すものではありません。

オーケストレーションの関連記事

BMCからのさらなる情報に興味がありますか?

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーションに関する月刊メールです:研究、顧客ストーリー、製品ニュース、イベント。

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ザ・ブリーフに登録しました

ザ・ブリーフは、メインフレームとエンタープライズオーケストレーション—BMC AMIおよびControl-M—に関するアナリストの研究、顧客の展開、両者にわたるイベントを網羅しています。