[SQL]ジョブ2


最初のチャンネルと最後のチャンネルをユーザー別に区別


ROW_NUMBER vs FIRST_VALUE/LAST_VALUE

SELECT ts, channel
FROM raw_data.user_session_channel usc
JOIN raw_data.session_timestamp st ON usc.sessionid = st.sessionid
WHERE userid = 251
ORDER BY 1
  • は、ユーザセッションチャネルとタイムスタンプとセッションIDとを組み合う
  • である.
  • useridは251の
  • のみをもたらす
  • のタイムスタンプに基づいてタイムソートを行うと、チャネル列の先頭と末尾は、それぞれユーザの1番目と最後のチャネル
  • となる.

    構造ブロックとしてCTEを使用

    %%sql
    
    WITH first AS (
       SELECT userid, ts, channel, ROW_NUMBER() OVER(PARTITION BY userid ORDER BY ts) seq
       FROM raw_data.user_session_channel usc
       JOIN raw_data.session_timestamp st ON usc.sessionid = st.sessionid
    ), last AS (
       SELECT userid, ts, channel, ROW_NUMBER() OVER(PARTITION BY userid ORDER BY ts DESC) seq
       FROM raw_data.user_session_channel usc
       JOIN raw_data.session_timestamp st ON usc.sessionid = st.sessionid
    )   
    SELECT first.userid AS userid, first.channel AS first_channel, last.channel AS last_channel
    FROM first
    JOIN last ON first.userid = last.userid and last.seq = 1
    WHERE first.seq = 1;
  • WITHによりテーブルの組合せfirst、lastテーブルが作成され、差異はタイムスタンプに準じ、昇順、降順
  • である.
  • seq列を新規作成し、順序1から
  • まで
    seq=1を
  • WHEREにインポートすると、最初のテーブルと最後のテーブルが
  • に従う.

    JOIN方式

    %%sql
    
    SELECT first.userid AS userid, first.channel AS first_channel, last.channel AS last_channel
    FROM (
      SELECT userid, ts, channel, ROW_NUMBER() OVER(PARTITION BY userid ORDER BY ts) seq
      FROM raw_data.user_session_channel usc
      JOIN raw_data.session_timestamp st ON usc.sessionid = st.sessionid
    ) first
    JOIN (
      SELECT userid, ts, channel, ROW_NUMBER() OVER(PARTITION BY userid ORDER BY ts DESC) seq
      FROM raw_data.user_session_channel usc
      JOIN raw_data.session_timestamp st ON usc.sessionid = st.sessionid
    )  last ON first.userid = last.userid and last.seq = 1
    WHERE first.seq = 1;
  • JOINを用いる、ユーザID、タイムスタンプ、チャンネル、seq名でtsごとに昇順
  • を行う.
  • テーブルを降順に並べ、
  • WHERE first.seq=1の条件下で
  • ユーザID、第1のチャネル、および最後のチャネルが得られる
  • の最上位のレコードは、第1および最後のチャネル
  • を含む.

    GROUP BY

    %%sql
    
    SELECT userid,
     MAX(CASE WHEN rn1 = 1 THEN channel END) first_touch,
     MAX(CASE WHEN rn2 = 1 THEN channel END) last_touch
    FROM (
      SELECT userid,
        channel,
        (ROW_NUMBER() OVER (PARTITION BY usc.userid ORDER BY  st.ts asc)) AS rn1,
        (ROW_NUMBER() OVER (PARTITION BY usc.userid ORDER BY  st.ts desc)) AS rn2
      FROM raw_data.user_session_channel usc
      JOIN raw_data.session_timestamp st ON usc.sessionid = st.sessionid
    )
    GROUP BY 1;
  • ユーザセッションチャネルおよびタイムスタンプは、セッションIDに従ってグループ化され、
  • .
  • ユーザID、チャンネル、rn 1(タイムスタンプに基づいてユーザIDを注文するパーティション)、rn 2(タイムスタンプに基づいてユーザIDを降格ソートするパーティション)、
  • を作成する.
  • ユーザID,rn 1=1,rn 2=1は、第1のタッチと最後のタッチを表す

    FIRST_VALUE/LAST_VALUE

    %%sql
    
    SELECT DISTINCT
        A.userid,
        FIRST_VALUE(A.channel) over(partition by A.userid order by B.ts
    rows between unbounded preceding and unbounded following) AS First_Channel,
        LAST_VALUE(A.channel) over(partition by A.userid order by B.ts
    rows between unbounded preceding and unbounded following) AS Last_Channel
    FROM raw_data.user_session_channel A
    LEFT JOIN raw_data.session_timestamp B ON A.sessionid = B.sessionid
    ORDER BY 1;
    ~と~の間の
  • 行を用いて、最終出力値の1番目(無境界の前面)と最後(無境界の後方)を求める、
  • .
  • FIRST VALUE、LAST VALUE関数を使用して最初の値と最後の値
  • を入力

    GrossRevenueの最大ユーザーIDを10個検索


    GROUP BY

    %%sql
    
    SELECT
        userID,
        SUM(amount)
    FROM raw_data.session_transaction st
    LEFT JOIN raw_data.user_session_channel usc ON st.sessionid = usc.sessionid
    GROUP BY 1
    ORDER BY 2 DESC
    LIMIT 10;
  • トランザクションはすべて整列し、LEFTJOINを使用してユーザセッションチャネルをトランザクションに接続する
  • .
  • GROUP BY、userIDの気持ちでamountの和を求め、
  • を降順に並べる
  • を取り付ける.

    SUM OVER

    %%sql
    
    SELECT DISTINCT
        usc.userid,
        SUM(amount) OVER(PARTITION BY usc.userid)
    FROM raw_data.user_session_channel AS usc
    JOIN raw_data.session_transaction AS revenue ON revenue.sessionid = usc.sessionid  
    ORDER BY 2 DESC 
    LIMIT 10;
  • パーティションデバイスはuseridベースの合計インストール値
  • を提供する.

    raw_data.npsテーブルに基づく毎月のNPS計算


    テーブルについて

  • お客様の意向は0から10まで
    -減算係数(推奨外):0~6
    -受動(ネガティブ):7または8
    -イニシエータ(広報担当者):9または10
    -NPS=プロモーター%減抵抗率%
  • CASE WHEN

    %%sql
    
    SELECT month, 
      ROUND((promoters-detractors)::float/total_count*100, 2) AS overall_nps
    FROM (
      SELECT LEFT(created, 7) AS month,
        COUNT(CASE WHEN score >= 9 THEN 1 END) AS promoters,
        COUNT(CASE WHEN score <= 6 THEN 1 END) AS detractors,
        COUNT(CASE WHEN score > 6 AND score < 9 THEN 1 END) As passives,
        COUNT(1) AS total_count
      FROM raw_data.nps
      GROUP BY 1
      ORDER BY 1
    );
  • アップグレードカウント、ジッタカウント、パッシブカウント、合計カウント、作成(作成日)時に
  • を貼り付けます.
  • のアップグレードマシンでジッタを減算値をTOTAL COUNTで除算し、100を乗じ、小数点3の四捨五入値にnps列を合計
  • を加えた.

    WHEN

    %%sql
    
    SELECT LEFT(created, 7) AS month,
      ROUND(SUM(CASE
        WHEN score >= 9 THEN 1 
        WHEN score <= 6 THEN -1 END)::float*100/COUNT(1), 2)
    FROM raw_data.nps
    GROUP BY 1
    ORDER BY 1;
  • の得点が9以上であると+16以下の得点は-1となり、合計を目標として演算する
  • となる.