メインコンテンツへスキップ
見出し画像
Photo byakisuke0925

【第349回】 Marketing Cloud Next : Query Editor で分析に使えるクエリ集

    Nobuyuki Watanabe

    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 10

    Email 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 10

    Website 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 10

    Unified 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 10

    Unified 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 10

    Unified 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 10

    Identity 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 10

    Unified 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:現在のメールアドレス

    今回は以上です。


    次の記事はこちら

    前回の記事はこちら

    私の note のトップページはこちら

     
     
     
    Salesforce Marketing Cloud、Agentforce、Data Cloud、Salesforce 認定資格に関する実践的な情報を発信しています。これらの記事が、皆さまの学習や日々の業務に少しでもお役に立てば幸いです。