
【第179回】 Marketing Cloud SQL 中級編(3)- TOP、ORDER BY
これまでに Markeitng Cloud SQL の基本 に始まり、SELECT、FROM、WHERE 、そして Dataview の使用、日付関数、IN(NOT IN)、IS NULL、JOIN、AND、OR、CASE、DISTINCT、集計関数、GROUP BY の使い方について学習しました。
これらの SQL 超入門の記事を学習することで、以下に示すような ①②③④ の事例にも対応できるようになりました。
① データエクステンション内のデータを調査したい
② データビューを使用して、エンゲージ(関与)した顧客を知りたい
③ データビューを活用して、別の配信リストを作りたい
④ 2 つ以上のデータエクステンションを組み合わせて、別のデータエクステンションを作成したい
そして、Marketing Cloud SQL 中級編では、さらに役立つ内容を紹介しています。この中級編の記事では CASE、DISTINCT、集計関数、GROUP BY を学習し、今回の記事では TOP と ORDER BY を学習したいと思います。
■ TOP について
TOP とは、結果として返されるレコードの数を「数字」や「パーセンテージ」で指定することができる便利機能です。
その使い方は、簡単で SELECT の直後に TOP ○○ と記載します。
■「数字」で指定する場合
SELECT TOP ○○
■「パーセンテージ」で指定する場合
SELECT TOP ○○ PERCENT
※パーセンテージの場合は 小数点以下は切り上げ です
※パーセンテージの場合は Query Studio ではエラーとなってしまいます
前回の記事の最後で紹介した SQL クエリを再掲載します。このクエリを実行することで 10 レコードが取得できます。
SELECT a.Id,
a.Email,
a.Name COLLATE Japanese_CS_AS_KS_WS AS [Name],
a.Prefecture COLLATE Japanese_CS_AS_KS_WS AS [Prefecture],
b.PurchaseCount,
b.CustomerRank
FROM MasterSubscribers a
INNER JOIN (
SELECT UserId,
COUNT(UserId) AS [PurchaseCount],
CASE
WHEN COUNT(UserId) >= 100 THEN '優良顧客'
ELSE '一般顧客'
END COLLATE Japanese_CS_AS_KS_WS AS [CustomerRank]
FROM MasterOrder
GROUP BY UserId
) b ON a.Id = b.UserId

このクエリに、TOP 3 を設定してみます。
SELECT TOP 3
a.Id,
a.Email,
a.Name COLLATE Japanese_CS_AS_KS_WS AS [Name],
a.Prefecture COLLATE Japanese_CS_AS_KS_WS AS [Prefecture],
b.PurchaseCount,
b.CustomerRank
FROM MasterSubscribers a
INNER JOIN (
SELECT UserId,
COUNT(UserId) AS [PurchaseCount],
CASE
WHEN COUNT(UserId) >= 100 THEN '優良顧客'
ELSE '一般顧客'
END COLLATE Japanese_CS_AS_KS_WS AS [CustomerRank]
FROM MasterOrder
GROUP BY UserId
) b ON a.Id = b.UserId
すると、以下の通り 3 レコードのみが取得されました。

但し、ID のところを見ても、購入回数(PurchaseCount)のところを見ても順不同ですよね。ランダムに取得する場合はこれでも良いのですが、何らかの順番でレコードを取得したい場合があるかと思います。
そこで、これを並び替えるのが、次に紹介する ORDER BY です。
■ ORDER BY について
ORDER BY とは、結果として返されるレコードの順番を昇順 or 降順 で並び替える機能です。
以下のようにクエリを記載します。
ORDER BY Id ASC
ORDER BY PurchaseCount DESC
この項目名の後ろに記載されている ASC が「昇順」(Ascending Order)で、DESC が「降順」(Descending Order)の意味になります。
この ASC と DESC の覚え方ですが、単語の頭を見ると「A」と「DE」の違いがあります。「A」はアルファベットの始まりなので、ABC という昇順であると覚え、「DE」は、デメリットなど「否定」の意味があるので、ASC の逆の降順であると覚えましょう。
また、デフォルトは ASC「昇順」なので、項目名の後ろに何も記載しなければ「昇順」となります。
それでは以下のクエリを実行してみます。
SELECT TOP 3
a.Id,
a.Email,
a.Name COLLATE Japanese_CS_AS_KS_WS AS [Name],
a.Prefecture COLLATE Japanese_CS_AS_KS_WS AS [Prefecture],
b.PurchaseCount,
b.CustomerRank
FROM MasterSubscribers a
INNER JOIN (
SELECT UserId,
COUNT(UserId) AS [PurchaseCount],
CASE
WHEN COUNT(UserId) >= 100 THEN '優良顧客'
ELSE '一般顧客'
END COLLATE Japanese_CS_AS_KS_WS AS [CustomerRank]
FROM MasterOrder
GROUP BY UserId
) b ON a.Id = b.UserId
ORDER BY b.PurchaseCount DESC
すると以下の通り、購入回数(PurchaseCount)が多い人から 3 名分のレコードが取得できました。成功です。

このように、TOP と ORDER BY はセットで使用されることが多いです。
ちなみに、TOP は上記の例の通り単体で使用できますが、ORDER BY は単体で使用しようとするとエラーが発生します。必ず TOP も併用しましょう。
例えば、50 万レコードの並び替えを行いたい場合、少し多めの TOP 600000 と設定してあげることで、これを実行できるようになります。
■ クエリの記載順と実行順について
それでは最後に、ここまで SELECT、FROM、WHERE、JOIN、DISTINCT、GROUP BY、HAVING、ORDER BY などを学習してきました。
これまでの記事で、クエリの「記載順」や「実行順」には触れ来ませんでしたので、最後にまとめてみたいと思います。
■ クエリの記載順
① SELECT
② DISTINCT
③ FROM
④ JOIN
⑤ WHERE
⑥ GROUP BY
⑦ HAVING
⑧ ORDER BY
この順番でクエリを記述します。
続いて、クエリが実行される順番についてですが、上との比較で分かりやすいよう、クエリの記載順はそのまま残しておきます。
■ クエリの実行順
③ FROM
④ JOIN
⑤ WHERE
⑥ GROUP BY
⑦ HAVING
① SELECT
② DISTINCT
⑧ ORDER BY
さて、ここで何を伝えたかったと言いますと、SELECT が割と遅い段階で処理されていることが分かります。
これが何を意味するかと言うと、以前の CASE に関する記事の時にも説明しましたが、例えば、SELECT の CASE では、AS(エイリアス)で命名されますが、GROUP BY 使用時に SELECT で命名した AS(エイリアス)が使用できないというお話でした。なぜなら、それは GROUP BY の処理段階では、まだ SELECT の命名が処理されていないからですね。このことが原因です。
このように、クエリの「記載順」や「実行順」はしっかりと覚えておくようにしてください。
いかがでしたでしょうか?
今回の記事で Marketing Cloud SQL 中級編 は終了です。ここまでで基本的な SQL の機能は、一通り網羅できたかと思います。よって、一旦、連載は終了し、別の機会に Marketing Cloud SQL 上級編を書いてみたいと思います。
今回は以上です。