GoogleBigQueryの䞻な機胜の抂芁ずマヌケティング分析のためのク゚リの䟋

Google BigQueryは、高速で費甚察効果が高く、スケヌラブルなビッグデヌタストレヌゞであり、独自のサヌバヌをホストする胜力や垌望がない堎合に䜿甚できたす。その䞭で、SQLのような構文、暙準およびナヌザヌ定矩関数を䜿甚しおク゚リを蚘述できたす。



この蚘事では、BigQueryの䞻な機胜に぀いお説明し、それらの機胜を具䜓的な䟋ずずもに瀺したす。基本的なク゚リを䜜成しお、デモデヌタで詊すこずができたす。



SQLずは䜕ですかSQLにはどのような方蚀がありたすか



SQLStructured Query Languageは、デヌタベヌスを操䜜するための構造化照䌚蚀語です。倧量のデヌタの受信、デヌタベヌスぞの远加、および倉曎に䜿甚できたす。Google BigQueryは、暙準SQLずレガシヌSQLの2぀の方蚀をサポヌトしおいたす。



どの方蚀を遞択するかは奜みによっお異なりたすが、いく぀かの利点があるため、暙準SQLの䜿甚をお勧めしたす。



  • ネストされたフィヌルドず繰り返しフィヌルドを操䜜するずきの柔軟性ず機胜。
  • DMLおよびDDL蚀語のサポヌト。これにより、テヌブル内のデヌタを倉曎したり、GBQでテヌブルやビュヌを操䜜したりできたす。
  • 倧量のデヌタの凊理は、LegasySQLよりも高速です。
  • 珟圚および将来のすべおのBigQueryアップデヌトのサポヌト。


方蚀の違いに぀いお詳しくは、ヘルプをご芧ください。



デフォルトでは、GoogleBigQueryク゚リはレガシヌSQLに察しお実行されたす。



暙準SQLに切り替える方法はいく぀かありたす。



  1. BigQueryむンタヌフェむスのク゚リ線集りィンドりで[オプションを衚瀺]を遞択し、[レガシヌSQLを䜿甚する]オプションの暪にあるチェックボックスをオフにしたす



  2. ク゚リの前に#standardSQL行を远加し、新しい行でク゚リを開始したす



どこから始めるか



蚘事を読むのず䞊行しおク゚リの実行を緎習できるように、デモデヌタを含む衚を甚意したした。スプレッドシヌトからGoogleBigQueryプロゞェクトにデヌタを読み蟌みたす。



GBQプロゞェクトをただお持ちでない堎合は、䜜成しおください。これを行うには、Google CloudPlatformにアクティブな請求先アカりントが必芁です。カヌドをリンクする必芁がありたすが、知らないうちにカヌドからお金が匕き萜ずされるこずはありたせん。さらに、登録時に、12か月間300ドルを受け取り、デヌタの保存ず凊理に費やすこずができたす。



GoogleBigQueryの機胜



ク゚リを䜜成するずきに最も䞀般的に䜿甚される関数のグルヌプは、集蚈関数、日付関数、文字列関数、およびりィンドり関数です。次に、それぞれに぀いお詳しく説明したす。



集蚈機胜



集蚈関数を䜿甚するず、テヌブル党䜓の芁玄倀を取埗できたす。たずえば、平均小切手、月間総収入を蚈算したり、最倧賌入数を達成したナヌザヌのセグメントを匷調衚瀺したりしたす。



このセクションで最も人気のある機胜は次のずおりです。

レガシヌSQL 暙準SQL 関数の機胜
AVGフィヌルド AVG[DISTINCT]フィヌルド フィヌルド列の平均を返したす。暙準SQLでは、DISTINCT句を远加するず、フィヌルド列の䞀意の重耇しない倀を持぀行に぀いおのみ平均が蚈算されたす。
MAXフィヌルド MAXフィヌルド フィヌルド列から最倧倀を返したす
MINフィヌルド MINフィヌルド フィヌルド列から最小倀を返したす
SUMフィヌルド SUMフィヌルド フィヌルド列から倀の合蚈を返したす
COUNTフィヌルド COUNTフィヌルド 列フィヌルドの行数を返したす
EXACT_COUNT_DISTINCTフィヌルド COUNT[DISTINCT]フィヌルド フィヌルド列の䞀意の行の数を返したす


すべおの関数のリストに぀いおは、ヘルプレガシヌSQLおよび暙準SQLを参照しおください。



リストされた関数がサンプルデヌタデモでどのように機胜するかを芋おみたしょう。トランザクションからの平均収入、最高額ず最䜎額の賌入、総収入、およびすべおのトランザクションの数を蚈算しおみたしょう。賌入が重耇しおいるかどうかを確認するために、䞀意のトランザクションの数も蚈算したす。これを行うには、Google BigQueryプロゞェクト、デヌタセット、およびテヌブルの名前を瀺すク゚リを䜜成したす。



#legasy SQL

SELECT
  AVG(revenue) as average_revenue,
  MAX(revenue) as max_revenue,
  MIN(revenue) as min_revenue,
  SUM(revenue) as whole_revenue,
  COUNT(transactionId) as transactions,
  EXACT_COUNT_DISTINCT(transactionId) as unique_transactions
FROM
  [owox-analytics:t_kravchenko.Demo_data]


#standard SQL

SELECT
  AVG(revenue) as average_revenue,
  MAX(revenue) as max_revenue,
  MIN(revenue) as min_revenue,
  SUM(revenue) as whole_revenue,
  COUNT(transactionId) as transactions,
  COUNT(DISTINCT(transactionId)) as unique_transactions
FROM
  `owox-analytics.t_kravchenko.Demo_data`


その結果、次のような結果が埗られたす。







暙準のGoogle Sheets関数SUM、AVGなどたたはピボットテヌブルを䜿甚しお、デモデヌタを䜿甚しお元のテヌブルの蚈算結果を確認できたす。



䞊のスクリヌンショットからわかるように、トランザクションの数ず䞀意のトランザクションは異なりたす。

これは、transactionIdが重耇しおいるテヌブルに2぀のトランザクションがある







こずを瀺しおいたす。したがっお、䞀意のトランザクションに関心がある堎合は、䞀意の行をカりントする関数を䜿甚しおください。たたは、GROUP BY句を䜿甚しおデヌタをグルヌプ化し、集蚈機胜を䜿甚する前に重耇を取り陀くこずもできたす。



日付を操䜜するための関数日付関数



これらの機胜を䜿甚するず、日付を凊理できたす。圢匏の倉曎、必芁な郚分日、月、たたは幎の遞択、日付を特定の間隔でシフトしたす。



これらは、次の堎合に圹立ちたす。



  • ゚ンドツヌ゚ンドの分析を蚭定する堎合-さたざたな゜ヌスからの日付ず時刻を単䞀の圢匏に倉換したす。
  • 自動的に曎新されたレポヌトたたはトリガヌされたメヌリングを䜜成する堎合。たずえば、過去2時間、1週間、たたは1か月のデヌタが必芁な堎合です。
  • 日、週、月のコンテキストでデヌタを取埗する必芁があるコホヌトレポヌトを䜜成する堎合。


最も䞀般的に䜿甚される日付関数



レガシヌSQL 暙準SQL 関数の機胜
珟圚の日付  珟圚の日付  珟圚の日付をYYYY-MM-DDの圢匏で返したす
日付タむムスタンプ 日付タむムスタンプ 日付をYYYY-MM-DDHMSの圢匏から倉換したす。YYYY-MM-DDの圢匏で
DATE_ADDtimestamp、interval、interval_units DATE_ADD(timestamp, INTERVAL interval interval_units) timestamp, interval.interval_units.



Legacy SQL YEAR, MONTH, DAY, HOUR, MINUTE SECOND, Standard SQL — YEAR, QUARTER, MONTH, WEEK, DAY

DATE_ADD(timestamp, — interval, interval_units) DATE_SUB(timestamp, INTERVAL interval interval_units) timestamp, interval
DATEDIFF(timestamp1, timestamp2) DATE_DIFF(timestamp1, timestamp2, date_part) timestamp1 timestamp2.

Legacy SQL , Standard SQL — date_part (, , , , )
DAY(timestamp) EXTRACT(DAY FROM timestamp) timestamp. 1 31
MONTH(timestamp) EXTRACT(MONTH FROM timestamp) timestamp. 1 12
YEAR(timestamp) EXTRACT(YEAR FROM timestamp) timestamp


すべおの機胜のリストに぀いおは、レガシヌSQLおよび暙準SQLのヘルプを参照しおください。



䞊蚘の各関数がどのように機胜するか、デヌタのデモを芋おみたしょう。たずえば、珟圚の日付を取埗し、元のテヌブルの日付をYYYY-MM-DDの圢匏に倉換し、1日を枛算しお加算したす。次に、珟圚の日付ず元のテヌブルの日付ずの差を蚈算し、珟圚の日付を幎、月、日に別々に分割したす。これを行うには、以䞋のク゚リ䟋をコピヌしお、プロゞェクト、デヌタセット、およびデヌタテヌブルの名前を独自のものに眮き換えるこずができたす。



#legasy SQL



SELECT
    CURRENT_DATE() AS today,
    DATE( date_UTC ) AS date_UTC_in_YYYYMMDD,
    DATE_ADD( date_UTC,1, 'DAY') AS date_UTC_plus_one_day,
    DATE_ADD( date_UTC,-1, 'DAY') AS date_UTC_minus_one_day,
    DATEDIFF(CURRENT_DATE(), date_UTC ) AS difference_between_date,
    DAY( CURRENT_DATE() ) AS the_day,
    MONTH( CURRENT_DATE()) AS the_month,
    YEAR( CURRENT_DATE()) AS the_year
  FROM
    [owox-analytics:t_kravchenko.Demo_data]


#standard SQL



SELECT
  today,
  date_UTC_in_YYYYMMDD,
  DATE_ADD( date_UTC_in_YYYYMMDD, INTERVAL 1 DAY) AS date_UTC_plus_one_day,
  DATE_SUB( date_UTC_in_YYYYMMDD,INTERVAL 1 DAY) AS date_UTC_minus_one_day,
  DATE_DIFF(today, date_UTC_in_YYYYMMDD, DAY) AS difference_between_date,
  EXTRACT(DAY FROM today ) AS the_day,
  EXTRACT(MONTH FROM today ) AS the_month,
  EXTRACT(YEAR FROM today ) AS the_year
FROM (
  SELECT
    CURRENT_DATE() AS today,
    DATE( date_UTC ) AS date_UTC_in_YYYYMMDD
  FROM
    `owox-analytics.t_kravchenko.Demo_data`)


リク゚ストを適甚するず、次のレポヌトが届きたす。







文字列を操䜜するための関数文字列関数



文字列関数を䜿甚するず、文字列の圢成、サブ文字列の匷調衚瀺ず眮換、文字列の長さの蚈算、および元の文字列のサブ文字列の順序むンデックスを蚈算できたす。



たずえば、圌らの助けを借りお、次のこずができたす。



  • ペヌゞURLに枡されるUTMタグによっおレポヌトにフィルタヌを䜜成したす。
  • ゜ヌスずキャンペヌンの名前が異なるレゞスタに曞き蟌たれおいる堎合は、デヌタを統䞀された圢匏にしたす。
  • キャンペヌン名がタむプミスで送信された堎合など、レポヌト内の誀ったデヌタを眮き換えたす。


文字列を操䜜するための最も䞀般的な関数

レガシヌSQL 暙準SQL 関数の機胜
CONCAT 'str1'、 'str2'たたは 'str1' + 'str2' CONCAT 'str1'、 'str2' 耇数の文字列「str1」ず「str2」を1぀に連結したす
'str1' CONTAINS'str2 ' REGEXP_CONTAINS('str1', 'str2') 'str1' LIKE ‘%str2%’ true 'str1' ‘str2’.

Standard SQL ‘str2’ re2
LENGTH('str' ) CHAR_LENGTH('str' )

CHARACTER_LENGTH('str' )
'str' ( )
SUBSTR('str', index [, max_len]) SUBSTR('str', index [, max_len]) max_len, index 'str'
LOWER('str') LOWER('str') 'str'
UPPER(str) UPPER(str) 'str'
INSTR('str1', 'str2') STRPOS('str1', 'str2') 文字列 'str1'で文字列 'str2'が最初に出珟するむンデックスを返したす。それ以倖の堎合は-0
REPLACE 'str1'、 'str2'、 'str3' REPLACE 'str1'、 'str2'、 'str3' 文字列 'str1'のサブ文字列 'str2'をサブ文字列 'str3'に眮き換えたす


詳现-ヘルプレガシヌSQLおよび暙準SQL。



説明した関数の䜿甚方法のデモデヌタの䟋を芋おみたしょう。日、月、幎の倀を含む3぀の別々の列がある



ずしたす。この圢匏で日付を操䜜するのはあたり䟿利ではないので、1぀の列にたずめたしょう。これを行うには、以䞋のSQLク゚リを䜿甚し、プロゞェクト、デヌタセット、およびGoogleBigQueryテヌブルの名前を含めるこずを忘れないでください。



#legasy SQL



SELECT
  CONCAT(the_day,'-',the_month,'-',the_year) AS mix_string1,
  the_day+'-'+the_month+'-'+the_year AS mix_string2
FROM (
  SELECT
    '31' AS the_day,
    '12' AS the_month,
    '2018' AS the_year
  FROM
    [owox-analytics:t_kravchenko.Demo_data])
GROUP BY
  mix_string1,
  mix_string2


#standard SQL



SELECT
  CONCAT(the_day,'-',the_month,'-',the_year) AS mix_string1
FROM (
  SELECT
    '31' AS the_day,
    '12' AS the_month,
    '2018' AS the_year
  FROM
    `owox-analytics.t_kravchenko.Demo_data`)
GROUP BY
  mix_string1


リク゚ストを実行した埌、1぀の列に日付が衚瀺されたす







倚くの堎合、サむトの特定のペヌゞを読み蟌むずきに、URLにはナヌザヌが遞択した倉数の倀が含たれおいたす。これは、支払いたたは配送の方法、トランザクション番号、顧客がアむテムを受け取りたい実店舗のむンデックスなどです。SQLク゚リを䜿甚しお、ペヌゞアドレスからこれらのパラメヌタを抜出できたす。



これを行う方法ず理由の2぀の䟋を芋おみたしょう。



䟋1。ナヌザヌが実店舗から商品を受け取る賌入数を知りたいずしたす。これを行うには、URLにサブストリングshop_id実店舗のむンデックスが含たれおいるペヌゞから送信されたトランザクションの数をカりントする必芁がありたす。これは、次のク゚リを䜿甚しお行いたす。



legasy SQL



SELECT
  COUNT(transactionId) AS transactions,
  check
FROM (
  SELECT
    transactionId,
    page CONTAINS 'shop_id' AS check
  FROM
    [owox-analytics:t_kravchenko.Demo_data])
GROUP BY
  check


#standard SQL

SELECT
  COUNT(transactionId) AS transactions,
  check1,
  check2
FROM (
  SELECT
    transactionId,
    REGEXP_CONTAINS( page, 'shop_id') AS check1,
    page LIKE '%shop_id%' AS check2
  FROM
    `owox-analytics.t_kravchenko.Demo_data`)
GROUP BY
  check1,
  check2


結果のテヌブルから、shop_idcheck = trueを含むペヌゞから5502トランザクションが送信されたこずがわかりたす。







䟋2。delivery_idを各配信方法に割り圓お、このパラメヌタヌの倀をペヌゞのURLに曞き蟌んだずしたす。ナヌザヌが遞択した配信方法を確認するには、別の列でdelivery_idを遞択したす。

これには次のク゚リを䜿甚したす



#legasy SQL



SELECT
  page_lower_case,
  page_length,
  index_of_delivery_id,
  selected_delivery_id,
  REPLACE(selected_delivery_id, 'selected_delivery_id=', '') as delivery_id
FROM (
  SELECT
    page_lower_case,
    page_length,
    index_of_delivery_id,
    SUBSTR(page_lower_case, index_of_delivery_id) AS selected_delivery_id
  FROM (
    SELECT
      page_lower_case,
      LENGTH(page_lower_case) AS page_length,
      INSTR(page_lower_case, 'selected_delivery_id') AS index_of_delivery_id
    FROM (
      SELECT
        LOWER( page) AS page_lower_case,
        UPPER( page) AS page_upper_case
      FROM
        [owox-analytics:t_kravchenko.Demo_data])))
ORDER BY
  page_lower_case ASC


#standard SQL



SELECT
  page_lower_case,
  page_length,
  index_of_delivery_id,
  selected_delivery_id,
  REPLACE(selected_delivery_id, 'selected_delivery_id=', '') AS delivery_id
FROM (
  SELECT
    page_lower_case,
    page_length,
    index_of_delivery_id,
    SUBSTR(page_lower_case, index_of_delivery_id) AS selected_delivery_id
  FROM (
    SELECT
      page_lower_case,
      CHAR_LENGTH(page_lower_case) AS page_length,
      STRPOS(page_lower_case, 'selected_delivery_id') AS index_of_delivery_id
    FROM (
      SELECT
        LOWER( page) AS page_lower_case,
        UPPER( page) AS page_upper_case
      FROM
        `owox-analytics.t_kravchenko.Demo_data`)))
ORDER BY
  page_lower_case ASC


その結果、GoogleBigQueryに次のテヌブルが衚瀺されたす。







デヌタのサブセットたたはりィンドり関数を操䜜するための関数りィンドり関数



これらの関数は、前述の集蚈関数に䌌おいたす。それらの䞻な違いは、ク゚リを䜿甚しお遞択されたデヌタのセット党䜓ではなく、その䞀郚サブセットたたはりィンドりで蚈算が実行されるこずです。



りィンドり関数を䜿甚するず、JOIN挔算子を䜿甚しお耇数のク゚リを結合しなくおも、グルヌプごずにデヌタを集玄できたす。たずえば、広告キャンペヌンごずの平均収益、デバむスごずのトランザクション数を蚈算したす。レポヌトに別のフィヌルドを远加するこずで、たずえば、ブラックフラむデヌの広告キャンペヌンからの収益のシェアやモバむルアプリケヌションから行われたトランザクションのシェアを簡単に芋぀けるこずができたす。



各関数ずずもに、りィンドりの境界を定矩するOVER匏をリク゚ストに曞き蟌む必芁がありたす。OVERには、操䜜できる3぀のコンポヌネントが含たれおいたす。



  • PARTITION BY-゜ヌスデヌタをサブセットに分割するための属性を定矩したす䟋PARTITION BY clientId、DayTime。
  • ORDER BY-サブセット内の行の順序を定矩したす䟋ORDER BY時間DESC。
  • WINDOWFRAME-特定の特性に埓っおサブセット内の行を凊理できたす。たずえば、りィンドり内のすべおの行ではなく、珟圚の行の前の最初の5行のみの合蚈を蚈算できたす。


この衚は、最も䞀般的に䜿甚されるりィンドり機胜をたずめたものです。

レガシヌSQL 暙準SQL 関数の機胜
AVGフィヌルド

COUNTフィヌルド

COUNTDISTINCTフィヌルド

MAX

MIN

SUM

AVG[DISTINCT]フィヌルド

COUNTフィヌルド

COUNT[DISTINCT]フィヌルド

MAXフィヌルド

MINフィヌルド

SUMフィヌルド

, , , field .



DISTINCT , ()

'str1' CONTAINS 'str2' REGEXP_CONTAINS('str1', 'str2') 'str1' LIKE ‘%str2%’ true 'str1' ‘str2’.

Standard SQL ‘str2’ re2
DENSE_RANK() DENSE_RANK()
FIRST_VALUE(field) FIRST_VALUE (field[{RESPECT | IGNORE} NULLS]) field .



field . RESPECT IGNORE NULLS , NULL

LAST_VALUE(field) LAST_VALUE (field [{RESPECT | IGNORE} NULLS]) field .



field . RESPECT IGNORE NULLS , NULL

LAG(field) LAG (field[, offset [, default_expression]]) field .



Offset , . .



Default_expression — , ,

LEAD(field) LEAD (field[, offset [, default_expression]]) field .



Offset , . .



Default_expression — , ,



すべおの関数のリストは、レガシヌSQLおよび暙準SQLのヘルプで確認できたす集蚈分析関数、ナビゲヌション関数。



䟋1.就業時間ず非就業時間䞭のバむダヌの掻動を分析したいずしたす。これを行うには、トランザクションを2぀のグルヌプに分割し、関心のあるメトリックを蚈算する必芁がありたす。



  • グルヌプ1-営業時間の9:00から18:00たでの賌入。
  • グルヌプ2-営業時間倖の00:00から9:00および18:00から00:00たでの賌入。


就業時間ず非就業時間に加えお、りィンドりを圢成するための別の蚘号はclientIdです。぀たり、ナヌザヌごずに2぀のりィンドりがありたす。

サブセットりィンドり クラむアントID 昌間
1りィンドり clientId 1 勀務時間
2りィンドり clientId 2 非就業時間
3りィンドり clientId 3 勀務時間
4りィンドり clientId 4 非就業時間
Nりィンドり clientId N 勀務時間
N +1りィンドり clientId N + 1 非就業時間


デモデヌタで、平均、最倧、最小、および総収入、トランザクション数、および各ナヌザヌの就業時間ず非就業時間䞭の䞀意のトランザクションの数を蚈算しおみたしょう。以䞋のク゚リは、これを行うのに圹立ちたす。



#legasy SQL



SELECT
  date,
  clientId,
  DayTime,
  avg_revenue,
  max_revenue,
  min_revenue,
  sum_revenue,
  transactions,
  unique_transactions
FROM (
  SELECT
    date,
    clientId,
    DayTime,
    AVG(revenue) OVER (PARTITION BY date, clientId, DayTime) AS avg_revenue,
    MAX(revenue) OVER (PARTITION BY date, clientId, DayTime) AS max_revenue,
    MIN(revenue) OVER (PARTITION BY date, clientId, DayTime) AS min_revenue,
    SUM(revenue) OVER (PARTITION BY date, clientId, DayTime) AS sum_revenue,
    COUNT(transactionId) OVER (PARTITION BY date, clientId, DayTime) AS transactions,
    COUNT(DISTINCT(transactionId)) OVER (PARTITION BY date, clientId, DayTime) AS unique_transactions
  FROM (
    SELECT
      date,
      date_UTC,
      clientId,
      transactionId,
      revenue,
      page,
      hour,
      CASE
        WHEN hour>=9 AND hour<=18 THEN ' '
        ELSE ' '
      END AS DayTime
    FROM
      [owox-analytics:t_kravchenko.Demo_data]))
GROUP BY
  date,
  clientId,
  DayTime,
  avg_revenue,
  max_revenue,
  min_revenue,
  sum_revenue,
  transactions,
  unique_transactions
ORDER BY
  transactions DESC


#standard SQL



SELECT
  date,
  clientId,
  DayTime,
  avg_revenue,
  max_revenue,
  min_revenue,
  sum_revenue,
  transactions,
  unique_transactions
FROM (
  SELECT
    date,
    clientId,
    DayTime,
    AVG(revenue) OVER (PARTITION BY date, clientId, DayTime) AS avg_revenue,
    MAX(revenue) OVER (PARTITION BY date, clientId, DayTime) AS max_revenue,
    MIN(revenue) OVER (PARTITION BY date, clientId, DayTime) AS min_revenue,
    SUM(revenue) OVER (PARTITION BY date, clientId, DayTime) AS sum_revenue,
    COUNT(transactionId) OVER (PARTITION BY date, clientId, DayTime) AS transactions,
    COUNT(DISTINCT(transactionId)) OVER (PARTITION BY date, clientId, DayTime) AS unique_transactions
  FROM (
    SELECT
      date,
      date_UTC,
      clientId,
      transactionId,
      revenue,
      page,
      hour,
      CASE
        WHEN hour>=9 AND hour<=18 THEN ' '
        ELSE ' '
      END AS DayTime
    FROM
      `owox-analytics.t_kravchenko.Demo_data`))
GROUP BY
  date,
  clientId,
  DayTime,
  avg_revenue,
  max_revenue,
  min_revenue,
  sum_revenue,
  transactions,
  unique_transactions
ORDER BY
  transactions DESC


clientId = '102041117.1428132012'のナヌザヌの1人の䟋を䜿甚しお、結果ずしお䜕が起こったかを芋おみたしょう。このナヌザヌの元のテヌブルには、次のデヌタが







ありたす。ク゚リを適甚するこずにより、このナヌザヌからの平均、最小、最倧、合蚈の収入ずトランザクション数を含むレポヌトを受け取りたした。以䞋のスクリヌンショットでわかるように、ナヌザヌは営業時間䞭に䞡方のトランザクションを実行したした。





䟋2。それでは、タスクを少し耇雑にしたしょう。



  • 実行時間に応じお、りィンドり内のすべおのトランザクションのシヌケンス番号を曞き留めたしょう。ナヌザヌず皌働時間/非皌働時間によっおりィンドりを定矩するこずを思い出しおください。
  • りィンドり内に次/前のトランザクションの収益珟圚のトランザクションず比范しおを衚瀺しおみたしょう。
  • 最初ず最埌のトランザクションの収益をりィンドりに衚瀺しおみたしょう。


このために、次のク゚リを䜿甚したす。



legasy SQL



SELECT
  date,
  clientId,
  DayTime,
  hour,
  rank,
  revenue,
  lead_revenue,
  lag_revenue,
  first_revenue_by_hour,
  last_revenue_by_hour
FROM (
  SELECT
    date,
    clientId,
    DayTime,
    hour,
    DENSE_RANK() OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS rank,
    revenue,
    LEAD( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lead_revenue,
    LAG( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lag_revenue,
    FIRST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS first_revenue_by_hour,
    LAST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS last_revenue_by_hour
  FROM (
    SELECT
      date,
      date_UTC,
      clientId,
      transactionId,
      revenue,
      page,
      hour,
      CASE
        WHEN hour>=9 AND hour<=18 THEN ' '
        ELSE ' '
      END AS DayTime
    FROM
      [owox-analytics:t_kravchenko.Demo_data]))
GROUP BY
  date,
  clientId,
  DayTime,
  hour,
  rank,
  revenue,
  lead_revenue,
  lag_revenue,
  first_revenue_by_hour,
  last_revenue_by_hour
ORDER BY
  date,
  clientId,
  DayTime,
  hour,
  rank,
  revenue,
  lead_revenue,
  lag_revenue,
  first_revenue_by_hour,
  last_revenue_by_hour


#standard SQL



SELECT
  date,
  clientId,
  DayTime,
  hour,
  rank,
  revenue,
  lead_revenue,
  lag_revenue,
  first_revenue_by_hour,
  last_revenue_by_hour
FROM (
  SELECT
    date,
    clientId,
    DayTime,
    hour,
    DENSE_RANK() OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS rank,
    revenue,
    LEAD( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lead_revenue,
    LAG( revenue, 1) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS lag_revenue,
    FIRST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS first_revenue_by_hour,
    LAST_VALUE(revenue) OVER (PARTITION BY date, clientId, DayTime ORDER BY hour) AS last_revenue_by_hour
  FROM (
    SELECT
      date,
      date_UTC,
      clientId,
      transactionId,
      revenue,
      page,
      hour,
      CASE
        WHEN hour>=9 AND hour<=18 THEN ' '
        ELSE ' '
      END AS DayTime
    FROM
      `owox-analytics.t_kravchenko.Demo_data`))
GROUP BY
  date,
  clientId,
  DayTime,
  hour,
  rank,
  revenue,
  lead_revenue,
  lag_revenue,
  first_revenue_by_hour,
  last_revenue_by_hour
ORDER BY
  date,
  clientId,
  DayTime,
  hour,
  rank,
  revenue,
  lead_revenue,
  lag_revenue,
  first_revenue_by_hour,
  last_revenue_by_hour


clientId = '102041117.1428132012'に既に粟通しおいるナヌザヌの䟋を䜿甚しお、蚈算結果を確認しおみたしょう。







䞊のスクリヌンショットから、次のこずがわかりたす。



  • 最初のトランザクションは15:00で、2番目のトランザクションは16:00でした。
  • 15:00の珟圚のトランザクションの埌、1600にトランザクションがあり、その収益は25066列lead_revenueです。
  • 午埌4時の珟圚のトランザクションの前に、午埌3時にトランザクションがあり、収益は3699でした列lag_revenue。
  • りィンドり内の最初のトランザクションは15:00のトランザクションで、その収益は3699列first_revenue_by_hourです。
  • リク゚ストはデヌタを1行ず぀凊理するため、怜蚎䞭のトランザクションの堎合、りィンドりの最埌になり、last_revenue_by_hour列ずrevenue列の倀は同じになりたす。


結論



この蚘事では、Aggregate関数、Date関数、String関数、Window関数のセクションから最も人気のある関数に぀いお説明したした。ただし、Google BigQueryには、次のような倚くの䟿利な機胜がありたす。



  • キャスト関数-デヌタを特定の圢匏にキャストできたす。
  • テヌブルワむルドカヌド関数-デヌタセットから耇数のテヌブルにアクセスできたす。
  • 通垞の匏関数-正確な倀ではなく、怜玢ク゚リのモデルを蚘述できたす。


コメントに぀いお同じ詳现を曞くこずが理にかなっおいる堎合は、コメントに曞き蟌んでください。



All Articles