【第349回】 Marketing Cloud Next : Query Editor で分析に使えるクエリ集
Marketing Cloud Next Growth & Advanced Edition の Query Editor は Data Cloud 内のデータを調査するのに便利です。今回、私がよく利用している調査用クエリを公開します。
Query Editor が存在しているものの、その使い道がよく分からないとお悩みの場合は、以下の 7 つを入れて保存しておくと良いでしょう。どこかで利用できる可能性があります。
クエリエディターで Unified Data Cloud SQL の使用が開始されました。
時差分の 9 時間を埋める場合は、以下のように変更する必要があります。
❌:DATE_ADD('hour', 9, a.ssot__EngagementDateTm__c)
⭕:a.ssot__EngagementDateTm__c + interval '9 hour'
Email Engagement を確認する
最新の Email Engagement の情報を取得するのに便利です。WHERE 句を使えば、Salesforce ID、フロー名、メール要素 API 名などで絞り込みが可能です。
SELECT
a.ssot__IndividualId__c AS Id,
a.ssot__SendtimeEmailAddress__c AS Email,
i.ssot__FirstName__c AS FirstName,
i.ssot__LastName__c AS LastName,
a.ssot__EngagementDateTm__c + interval '9 hour' AS EngagementDateTime,
a.ssot__EngagementChannelActionId__c AS ActionName,
a.ssot__EmailRecipientSendStatus__c AS SendStatus,
c.ssot__Name__c AS EmailElementAPIName,
e.ssot__Name__c AS FlowName,
d.ssot__VersionNumber__c AS VersionNumber,
h.ssot__Name__c AS SegmentName,
a.ssot__EngagementActionReasonText__c AS ActionReason,
a.ssot__EmailBounceType__c AS BounceType,
a.ssot__BounceReasonText__c AS BounceReason,
a.ssot__UnsubscribeSourceText__c AS UnsubscribeSource,
a.ssot__ResolvedURL__c AS LinkURL,
g.ssot__Subject__c AS EmailSubject,
g.ssot__FromAddress__c AS FromAddress,
g.ssot__MessagePurpose__c AS MessagePurpose
FROM ssot__EmailEngagement__dlm a
JOIN ssot__FlowElementRun__dlm b ON a.ssot__FlowElementRunId__c = b.ssot__Id__c
JOIN ssot__FlowElement__dlm c ON b.ssot__FlowElementId__c = c.ssot__Id__c
JOIN ssot__FlowVersion__dlm d ON c.ssot__FlowVersionId__c = d.ssot__Id__c
JOIN ssot__Flow__dlm e ON d.ssot__FlowId__c = e.ssot__Id__c
JOIN ssot__BulkEmailMessage__dlm g ON a.ssot__BulkEmailMessageId__c = g.ssot__Id__c
LEFT OUTER JOIN ssot__MarketSegment__dlm h ON g.ssot__MarketSegmentId__c = h.ssot__Id__c
LEFT OUTER JOIN ssot__Individual__dlm i ON a.ssot__IndividualId__c = i.ssot__Id__c
-- WHERE a.ssot__EngagementChannelActionId__c != 'OPEN' /*Action Name Filter*/
-- WHERE a.ssot__IndividualId__c = '***' /*Individual Id Filter*/
-- WHERE a.ssot__SendtimeEmailAddress__c = '***' /*Email Filter*/
-- WHERE i.ssot__FirstName__c = '***' AND i.ssot__LastName__c = '***' /*Name Filter*/
-- WHERE e.ssot__Name__c = '***' /*Flow Name Filter*/
-- WHERE h.ssot__Name__c = '***' /*Segment Name Filter*/
-- WHERE c.ssot__Name__c = '***' /*Email Element API Name Filter*/
ORDER BY a.ssot__EngagementDateTm__c DESC
LIMIT 10Email Engagement
- ssot__IndividualId__c:個人 ID
- ssot__SendtimeEmailAddress__c:メールアドレス
- ssot__EngagementDateTm__c:エンゲージメント日時(UTC 表記)
※ 日本時間に合わせるため、9 時間プラスしています
- ssot__EngagementChannelActionId__c:エンゲージメント種別
- ssot__EmailRecipientSendStatus__c:送信ステータス
- ssot__EngagementActionReasonText__c: 未送信理由
- ssot__EmailBounceType__c:バウンスの種類
- ssot__BounceReasonText__c:バウンスした理由
- ssot__UnsubscribeSourceText__c:購読取り消しのソース
- ssot__ResolvedURL__c:クリックしたリンク URL
Flow Element Run
- なし:連結用
Flow Element
- ssot__Name__c:メール要素の API 名
Flow Version
- ssot__FlowId__c:フローの ID
- ssot__VersionNumber__c:フローバージョン番号
Flow
- ssot__Flow__dlm:フローの名前
Bulk Email Message
- ssot__Subject__c:メールの件名
- ssot__FromAddress__c:送信元メールアドレス
- ssot__MessagePurpose__c:商用 or トランザクション分類
Market Segment
- ssot__Name__c:使用されたセグメント名
Individual
- ssot__FirstName__c:名前
- ssot__LastName__c:苗字
Website Engagement を確認する
最新の Website Engagement の情報を取得するのに便利です。
※ UTM が付く項目は、外部 Web サイトを構成した場合に利用できます。
SELECT
ssot__IndividualId__c AS Id,
ssot__EngagementDateTm__c + interval '9 hour' AS EngagementDateTime,
ssot__PagePublicTitleName__c AS PageTitle,
ssot__EngagementChannelActionId__c AS ActionName,
ssot__LinkURL__c AS ClickLinkURL,
ssot__AnchorLinkLabelText__c AS ClinkLinkText,
-- ssot__UtmMediumName__c AS Medium,
-- ssot__UtmTermDescription__c AS Term,
-- ssot__UtmContentDescription__c AS Content,
-- ssot__UtmCampaignName__c AS Campaign,
-- ssot__UtmId__c AS CampaignId,
-- ssot__UtmSourcePlatformName__c AS SourcePlatform,
ssot__ReferrerURL__c AS ReferrerURL,
ssot__OSName__c AS OSName,
ssot__OSModelName__c AS OSVersion,
ssot__BrowserName__c AS BrowserName
FROM ssot__WebsiteEngagement__dlm
-- WHERE ssot__IndividualId__c = '***' /*Individual Id Filter*/
ORDER BY ssot__EngagementDateTm__c DESC
LIMIT 10Website Engagement
- ssot__IndividualId__c:個人 ID(匿名識別子)
- ssot__EngagementDateTm__c:エンゲージメント日時
- ssot__PagePublicTitleName__c:Web ページの名前
- ssot__EngagementChannelActionId__c:アクション種別
- ssot__LinkURL__c:クリックリンク URL
- ssot__AnchorLinkLabelText__c:リンクテキスト
- ssot__UtmMediumName__c:UTM メディア
- ssot__UtmTermDescription__c:UTM キーワード
- ssot__UtmContentDescription__c:UTM コンテンツ
- ssot__UtmCampaignName__c:UTM キャンペーン名
- ssot__UtmId__c:UTM キャンペーン ID
- ssot__UtmSourcePlatformName__c:参照元プラットフォーム
- ssot__ReferrerURL__c:参照 URL
- ssot__OSName__c:OS の名前
- ssot__OSModelName__c:OS のバージョン番号
- ssot__BrowserName__c:ブラウザの名前
※ パソコンやブラウザが異なれば、別の匿名識別子の扱いとなります。
※ キャッシュが削除された場合も、別の匿名識別子の扱いとなります。
個人 ID から統合レコードを確認する
個人 ID を入力すると、それに紐づく 統合個人 ID などが分かります。その統合 ID に複数の個人 ID が紐づいている場合は、すべてが表示されます。
SELECT UnifiedId, Id, FirstName, LastName, Email, DataSource, IRUpdatedDate
FROM (
SELECT
b.UnifiedRecordId__c AS UnifiedId,
b.SourceRecordId__c AS Id,
d.ssot__FirstName__c AS FirstName,
d.ssot__LastName__c AS LastName,
c.ssot__EmailAddress__c AS Email,
b.ssot__DataSourceObjectId__c AS DataSource,
b.CreatedDate__c + interval '9 hour' AS IRUpdatedDate,
ROW_NUMBER() OVER (
PARTITION BY b.SourceRecordId__c, c.ssot__EmailAddress__c
ORDER BY c.ssot__LastModifiedDate__c DESC
) AS rn
FROM
IndividualIdentityLink__dlm a /* ← 自分の Unified Link Individual DMO の API 名に変更する */
LEFT OUTER JOIN IndividualIdentityLink__dlm b /* ← 自分の Unified Link Individual DMO の API 名に変更する */
ON a.UnifiedRecordId__c = b.UnifiedRecordId__c
LEFT OUTER JOIN ssot__ContactPointEmail__dlm c
ON b.SourceRecordId__c = c.ssot__PartyId__c
LEFT OUTER JOIN UnifiedIndividual__dlm d /* ← 自分の Unified Individual DMO の API 名に変更する */
ON a.UnifiedRecordId__c = d.ssot__Id__c
WHERE a.SourceRecordId__c = '***' /*Individual Id Filter*/
-- WHERE c.ssot__EmailAddress__c = '***' /*Email Address Filter*/
) t
WHERE rn = 1
ORDER BY Id
LIMIT 10Unified Link Individual
- UnifiedRecordId__c:統合個人 ID(32 桁)
- SourceRecordId__c:個人 ID(Salesforce ID or 匿名識別子)
- ssot__DataSourceObjectId__c:データソースの名前
- CreatedDate__c:ID 解決の最終更新日
Contact Point Email
- ssot__EmailAddress__c:現在のメールアドレス
Unified Individual
- ssot__FirstName__c:名前
- ssot__LastName__c:苗字
統合個人 ID から個人レコードを確認する
統合個人 ID を入力すると、それに紐づく 個人 ID などが分かります。その統合 ID に複数の個人 ID が紐づいている場合は、すべてが表示されます。
SELECT UnifiedId, Id, FirstName, LastName, Email, DataSource, IRUpdatedDate
FROM (
SELECT
a.UnifiedRecordId__c AS UnifiedId,
a.SourceRecordId__c AS Id,
c.ssot__FirstName__c AS FirstName,
c.ssot__LastName__c AS LastName,
b.ssot__EmailAddress__c AS Email,
a.ssot__DataSourceObjectId__c AS DataSource,
a.CreatedDate__c + interval '9 hour' AS IRUpdatedDate,
ROW_NUMBER() OVER (
PARTITION BY a.SourceRecordId__c, b.ssot__EmailAddress__c
ORDER BY b.ssot__LastModifiedDate__c DESC
) AS rn
FROM
IndividualIdentityLink__dlm a /* ← 自分の Unified Link Individual DMO の API 名に変更する */
LEFT OUTER JOIN ssot__ContactPointEmail__dlm b
ON a.SourceRecordId__c = b.ssot__PartyId__c
LEFT OUTER JOIN UnifiedIndividual__dlm c /* ← 自分の Unified Individual DMO の API 名に変更する */
ON a.UnifiedRecordId__c = c.ssot__Id__c
WHERE a.UnifiedRecordId__c = '***' /*Unified Individual Id Filter*/
) t
WHERE rn = 1
ORDER BY Id
LIMIT 10Unified Link Individual
- UnifiedRecordId__c:統合個人 ID(32 桁)
- SourceRecordId__c:個人 ID(Salesforce ID or 匿名識別子)
- ssot__DataSourceObjectId__c:データソースの名前
- CreatedDate__c:ID 解決の最終更新日
Contact Point Email
- ssot__EmailAddress__c:現在のメールアドレス
Unified Individual
- ssot__FirstName__c:名前
- ssot__LastName__c:苗字
メールアドレスから同意ステータスを確認する
メールアドレスから現在の同意ステータスを確認します。
SELECT ContactPointValue, Status, SubscriptionName, ChannelName, LastModifiedDate, SourceType, SourceName
FROM (
SELECT
a.ssot__ContactPointValueText__c AS ContactPointValue,
a.ssot__ConsentStatus__c AS Status,
c.ssot__Name__c AS SubscriptionName,
d.ssot__Name__c AS ChannelName,
a.ssot__LastModifiedDate__c + interval '9 hour' AS LastModifiedDate,
a.ssot__ConsentCapturedSourceType__c AS SourceType,
a.ssot__ConsentCapturedSourceName__c AS SourceName,
ROW_NUMBER() OVER (
PARTITION BY a.ssot__ContactPointValueText__c, c.ssot__Name__c
ORDER BY a.ssot__LastModifiedDate__c DESC
) AS rn
FROM ssot__CommunicationSubscriptionConsent__dlm a
JOIN ssot__CommunicationSubscriptionChannelType__dlm b
ON a.ssot__CommunicationSubscriptionChannelTypeId__c = b.ssot__Id__c
JOIN ssot__CommunicationSubscription__dlm c
ON b.ssot__CommunicationSubscriptionId__c = c.ssot__Id__c
JOIN ssot__EngagementChannelType__dlm d
ON b.ssot__EngagementChannelTypeId__c = d.ssot__Id__c
-- WHERE a.ssot__ContactPointValueText__c = '***' /*Email Filter*/
) sub
WHERE rn = 1
ORDER BY LastModifiedDate DESC Communication Subscription Consent
- ssot__ContactPointValueText__c:連絡先(チャネル)の値
- ssot__ConsentStatus__c:同意ステータス
- ssot__LastModifiedDate__c:最終更新日
- ssot__ConsentCapturedSourceName__c:取得ソースの種別
- ssot__ConsentCapturedSourceType__c:取得ソースの名前
Communication Subscription Channel Type
- なし:連結用
Communication Subscription
- ssot__Name__c:サブスクリプションの名前
Engagement Channel Type
- ssot__Name__c:チャネルの種別
このクエリでデータが正しく取得できない場合は、DLO のマッピングが正しくありません。以下のマッピングを置き換えることで正しく動きます。マッピングを削除はできませんが、置き換えは可能です。

上記クエリで取得できない人用の簡略化したクエリ
マッピングの置き換えまではしたくない人は、以下を利用してください。
SELECT ContactPointValue, Status, LastModifiedDate, SourceType, SourceName
FROM (
SELECT
a.ssot__ContactPointValueText__c AS ContactPointValue,
a.ssot__ConsentStatus__c AS Status,
a.ssot__LastModifiedDate__c + interval '9 hour' AS LastModifiedDate,
a.ssot__ConsentCapturedSourceType__c AS SourceType,
a.ssot__ConsentCapturedSourceName__c AS SourceName
FROM ssot__CommunicationSubscriptionConsent__dlm a
JOIN ssot__CommunicationSubscriptionChannelType__dlm b
ON a.ssot__CommunicationSubscriptionChannelTypeId__c = b.ssot__Id__c
-- WHERE a.ssot__ContactPointValueText__c = '***' /*Email Filter*/
) sub
ORDER BY LastModifiedDate DESC
LIMIT 10同意レコードのないメールアドレスを確認する
Marketing Cloud Next の運用開始前に、現在 Contact Point Email にメールアドレスがあるにも関わらず、まだ同意レコードができていないメールアドレスを取得することができます。
SELECT
e.ContactPointValue,
s.SubscriptionChannelTypeId
FROM (
SELECT
LOWER(TRIM(ssot__EmailAddress__c)) AS EmailKey,
MIN(ssot__EmailAddress__c) AS ContactPointValue
FROM ssot__ContactPointEmail__dlm
WHERE ssot__EmailAddress__c IS NOT NULL
AND TRIM(ssot__EmailAddress__c) <> ''
GROUP BY
LOWER(TRIM(ssot__EmailAddress__c))
) e
CROSS JOIN (
SELECT DISTINCT
ssot__Id__c AS SubscriptionChannelTypeId
FROM ssot__CommunicationSubscriptionChannelType__dlm
) s
LEFT JOIN ssot__CommunicationSubscriptionConsent__dlm a
ON LOWER(TRIM(a.ssot__ContactPointValueText__c)) = e.EmailKey
AND a.ssot__CommunicationSubscriptionChannelTypeId__c
= s.SubscriptionChannelTypeId
WHERE a.ssot__Id__c IS NULL
ORDER BY
e.ContactPointValue,
s.SubscriptionChannelTypeId
LIMIT 100以下のようなメールアドレスはインポートすることができません。
@ がない:abc999.gmail.com
@ が複数:abc999@@gmail.com
@ より前が空:@gmail.com
ドメインが空:abc999@
ローカル部の先頭がピリオド:.abc999@gmail.com
ローカル部の末尾がピリオド:abc999.@gmail.com
ピリオドが連続:abc..999@gmail.com
ドメインの先頭・末尾がピリオド:abc999@.gmail.com
ドメイン内でピリオドが連続:abc999@dd..com
ドメイン名の先頭・末尾がハイフン:abc999@-gmail.com
半角スペースを含む:abc 999@gmail.com
前後に空白がある: abc999@gmail.com
改行・タブなどの制御文字を含む:abc999↵@gmail.com
全角の @ を使用:abc999@gmail.com
ドメイン部分がない:abc999@localhost
使用できない記号を含む:abc999,abc@gmail.com
ローカル部が長すぎる:@より前が 64 文字超
アドレス全体が長すぎる:全体が 254 文字超
個人 ID からセグメントを確認する
個人の氏名などから参加しているセグメントを確認します。
※ Unified Individual - Latest DMO の API 名の修正が必要です。
SELECT
a.Id__c AS UnifiedId,
c.ssot__ExternalRecordId__c AS Id,
c.ssot__FirstName__c AS FirstName,
c.ssot__LastName__c AS LastName,
d.ssot__EmailAddress__c AS CurrentEmail,
b.ssot__Name__c AS SegmentName,
a.Delta_Type__c AS DeltaType,
a.Timestamp__c + interval '9 hour' AS PublishDateTime
FROM Individual_Unified_SM_1755567709613__dlm a /* ← 自分の Unified Individual - Latest DMO の API 名に変更する */
JOIN ssot__MarketSegment__dlm b
ON a.Segment_Id__c = SUBSTRING(b.ssot__Id__c, 1, 15)
JOIN UnifiedIndividual__dlm c /* ← 自分の Unified Individual DMO の API 名に変更する */
ON a.Id__c = c.ssot__Id__c
LEFT JOIN ssot__ContactPointEmail__dlm d
ON c.ssot__ExternalRecordId__c = d.ssot__PartyId__c
-- WHERE b.ssot__Name__c = '***' /*Segment Name Filter*/
-- WHERE c.ssot__ExternalRecordId__c = '***' /*Individual ID Filter*/
-- WHERE c.ssot__FirstName__c = '***' AND c.ssot__LastName__c = '***' /*Full Name Filter*/
ORDER BY a.Timestamp__c DESC, a.Delta_Type__c DESC
LIMIT 10Unified Individual - Latest
- Id__c:統合個人 ID
- Delta_Type__c:「新規」or「既存」
- Timestamp__c:セグメント公開日時
Market Segment
- ssot__Name__c:セグメント名
Unified Individual
- ssot__ExternalRecordId__c:個人 ID
- ssot__FirstName__c:名前
- ssot__LastName__c:苗字
Contact Point Email
- ssot__EmailAddress__c:現在のメールアドレス
Communication Subscription Consent
- ssot__ConsentStatus__c:同意ステータス(オプトイン状況)
Identity Match の連携状況を確認する
システムにより、Identity Match が適用されたものが取得できます。
SELECT
ssot__DataSourceObjectId__c AS DataSounceName,
ssot__RecordId__c AS RecordId,
ssot__MatchingRecordId__c AS MatchingRecordId,
ssot__IdentityMatchType__c AS IdentityMatchType,
ssot__CreatedDate__c + interval '9 hour' AS CreatedDate,
ssot__IdentityMatchWeight__c AS IdentityMatchWeight,
ssot__IsAMatch__c AS IdentityMatchFlag
FROM
ssot__IdentityMatch__dlm
ORDER BY
ssot__IdentityMatchWeight__c DESC,
ssot__CreatedDate__c DESC
LIMIT 10Identity Match
- ssot__DataSourceObjectId__c:前から取得されている ID のソース名
- ssot__RecordId__c:前から取得されている ID
- ssot__MatchingRecordId__c:後に取得された ID
- ssot__IdentityMatchType__c:ID 一致種別
- ssot__CreatedDate__c:レコードの作成日時
- ssot__IdentityMatchWeight__c:一致フラグ(数値)
- ssot__IsAMatch__c:一致フラグ(ブーリアン)
参考:一致種別
- ID 一致種別:「prospect-to-lead」
- ID 一致種別:「prospect-to-contact」
- ID 一致種別:「lead-to-contact」
- ID 一致種別:「device-to-known」
Identity Match については、以下をご確認ください。
Individual DMO への取り込み状況を確認する
Salesforce CRM でレコードを作成したり、何か編集を加えたものが、データストリーム経由で、Individual DMO まで取り込まれたかを確認します。
SELECT
a.ssot__Id__c AS Id,
a.ssot__FirstName__c AS FirstName,
a.ssot__LastName__c AS LastName,
b.ssot__EmailAddress__c AS Email,
a.ssot__DataSourceObjectId__c AS DataSource,
/*a.ssot__IsAnonymous__c AS IsAnonymous,*/
a.ssot__LastModifiedDate__c + interval '9 hour' AS LastModifiedDate,
a.ssot__CreatedDate__c + interval '9 hour' AS CreatedDate
FROM ssot__Individual__dlm a
LEFT JOIN (
SELECT ssot__PartyId__c,
ssot__EmailAddress__c,
ROW_NUMBER() OVER (PARTITION BY ssot__PartyId__c ORDER BY ssot__LastModifiedDate__c DESC) AS rn
FROM ssot__ContactPointEmail__dlm
) b ON a.ssot__Id__c = b.ssot__PartyId__c
AND b.rn = 1
-- WHERE a.ssot__Id__c = '***'
-- WHERE a.ssot__IsAnonymous__c = '1'
ORDER BY a.ssot__LastModifiedDate__c DESC
LIMIT 10Unified Individual - Latest
- ssot__Id__c:個人 ID(Salesforce ID or 匿名識別子)
- ssot__FirstName__c:名前
- ssot__LastName__c:苗字
- ssot__DataSourceObjectId__c:データソースの名前
- ssot__IsAnonymous__c:匿名プロファイルであるかの確認
- ssot__LastModifiedDate__c :最終更新日時
- ssot__CreatedDate__c :レコード作成日時
Contact Point Email
- ssot__EmailAddress__c:現在のメールアドレス
今回は以上です。
