G-gen ã®ææã§ããBigQuery ã¯éåžžã®éçšããŒã¿ããŒã¹ãšç°ãªããåæçšããŒã¿ããŒã¹ã§ããããšããã鿣èŠåããããŒãã«ãæ±ãããšãå€ããªããŸãããã®ããã®ç¬ç¹ã®ããŒã¿åãšããŠãARRAY (é
å) ãš STRUCT (æ§é äœ) ããããŸãããããã«ã€ããŠè§£èª¬ããŸãã æŠèŠ ARRAY (é
å) ARRAY ãšã¯ ãµã³ãã«ããŒãã« SELECT SELECT ã WHERE SELECT ã CROSS JOIN SELECT (SELECT ~ UNNEST) CREATE TABLE / INSERT å¶é STRUCT (æ§é äœ) STRUCT ãšã¯ ãµã³ãã«ããŒãã« SELECT SELECT ã WHERE CREATE TABLE / INSERT å¶é ARRAY<STRUCT> (ãã¹ããããç¹°ãè¿ãå) ARRAY<STRUCT> ãšã¯ ãµã³ãã«ããŒãã« SELECT SELECT ã WHERE (ãšã©ãŒ) SELECT ã CROSS JOIN SELECT (SELECT ~ UNNEST) CREATE TABLE / INSERT å®è·µ : Google Analytics 4 ããŒã¿ãžã®ã¯ãšãª æŠèŠ ããŒãã«äŸ ã¯ãšãªäŸ1: ç¹å®ããŒãžã® PV æ°ãéèš ã¯ãšãªäŸ2 : string_value ãåãåºã颿°ãäœã ã¹ããŒãè¡šèš æŠèŠ ARRAY STRUCT ARRAY<STRUCT> æŠèŠ BigQuery 㯠Google Cloud (æ§ç§° GCP) ã®æäŸãããµãŒããŒã¬ã¹ãªåæçšããŒã¿ããŒã¹ã®ãµãŒãã¹ã§ããåå¿å (ã«ã©ã ã) ã®ç¹åŸŽãæã¡ãæéãã©ã³ã®éžæã«ããããŸãããããã©ã«ãã§ã¯ã¹ãã£ã³ããããŒã¿éã«å¿ããåŸé課éã§ãã ã¯ã©ãŠãäžã®åæçšããŒã¿ããŒã¹ã®ãã¹ããã©ã¯ãã£ã¹ãšããŠãããŒãã«ã鿣èŠåããããšã§ããŒã¿èªã¿åããçµåã®ã³ã¹ããäžããããã©ãŒãã³ã¹åäžãå³ãããšããããŸããä»åã玹ä»ãã ARRAY (é
å) ãš STRUCT (æ§é äœ) ã¯ãããããããŒã¿ã鿣èŠåããŠæã€åã§ãããããã®ããŒã¿åã«ã¯ãGoogle Analytics 4 ã Google Analytics for FirebaseãGoogle Cloud ã® Billing Export ãªã©ã§ããŒã¿ã BigQuery ã«ãšã¯ã¹ããŒããããšããåºäŒããŸãã ãã®ç¬ç¹ã®ã¯ãšãªã®ä»æ¹ã«èŠããããã人ãå€ãã®ã§ã¯ãªãã§ãããããåœèšäºã§ã¯ãããã«ã€ããŠè§£èª¬ãããŸãçµã¿åãããŠäœ¿ã ARRAY<STRUCT> ã«ã€ããŠãã玹ä»ããŸãã ãŸããæåŸã«ã¯ Google Analytics 4 ã®ããŒã¿ãæš¡ããããŒãã«ã«å¯Ÿããã¯ãšãªã®æ¹æ³ãäŸç€ºããŸãã åè : ãã¹ãããç¹°ãè¿ãããŠãããã£ãŒã«ãã䜿çšãã ARRAY (é
å) ARRAY ãšã¯ ARRAY (é
å) ãšã¯ããŒãå以äžã®åãããŒã¿åã®å€ã§æ§æãããé åºä»ããªã¹ããã®ããšã§ãã以äžã®ãããªãã®ãæããŸãã # INT64 ã®é
å [ 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 ] # STRING ã®é
å [" åœèª " , " ç®æ° " , " çç§ " , " ç€ŸäŒ "] é
åã®åãæã€ããŒãã«ã¯ä»¥äžã®ãããªãã®ã«ãªããŸãã (è¡çªå·) name subjects 1 ç°äž 倪é åœèª ç®æ° çç§ ç€ŸäŒ 2 éŽæš äºé åœèª ç®æ° â» (è¡çªå·) åã¯äžè¡ã®ãŸãšãŸãã瀺ãããã«äŸ¿å®çã«å²ãæ¯ã£ããã®ã§ãããããŒãã«å
ã®ããŒã¿ã§ã¯ãããŸããã äžèšã®ããŒãã«ã® subjects å㯠ARRAY ã§ããã 1è¡ã«2ã€ä»¥äžã®å€ ãå
¥ã£ãŠããŸãã ããã¯ãªã¬ãŒã·ã§ã³ã®ç¬¬1æ£èŠåœ¢ã«éåããŠãããéåžžã®ãªã¬ãŒã·ã§ãã«ã»ããŒã¿ããŒã¹ã§ã¯ãã®ãããªããŒã¿ã®æã¡æ¹ãããŸãããããã BigQuery ã®ãããªåæçšããŒã¿ããŒã¹ã§ã¯ãã®ãããªé
ååã䜿ããªã¬ãŒã·ã§ã³ãç¶æãããŸãŸããã¹ã¿ãšãã©ã³ã¶ã¯ã·ã§ã³ãåããªã倧çŠåž³çãªããŒãã«æ§æã«ããããšã§ãJOIN ã®ã³ã¹ããäžããããã©ãŒãã³ã¹åäžãå³ãããšãã§ããŸãã åè : Array type åè : é
åãªãã©ã« åè : é
åã®æäœ ãµã³ãã«ããŒãã« ããããã¯å®éã® SQL ã玹ä»ããªããã€ã¡ãŒãžãæŽãã§ãããŸãã以äžã® WITH å¥ãä»®æ³çãªãµã³ãã«ããŒãã«ãšããŠäœ¿ããŸãã name åãéåžžã® STRING åã§ãsubjects å㯠STRING åã®å€ãèŠçŽ ã«æã€é
ååã§ãã WITH t0 AS ( SELECT " ç°äž 倪é " AS name, [ " åœèª " , " ç®æ° " , " çç§ " , " ç€ŸäŒ " ] AS subjects UNION ALL SELECT " éŽæš äºé " AS name, [ " åœèª " , " ç®æ° " ] AS subjects ) SELECT * FROM t0; (è¡çªå·) name subjects 1 ç°äž 倪é åœèª ç®æ° çç§ ç€ŸäŒ 2 éŽæš äºé åœèª ç®æ° SELECT ãŸã SELECT æã®äŸãèŠãããšã§ã€ã¡ãŒãžãæŽã¿ãŸã (以éãWITH å¥ã¯çç¥ããŸããå
ã»ã©ã® SQL æåŸåã® SELECT 以éãæžãæããŠã詊ããã ãã)ã SELECT name, subjects FROM t0; äžèšã®ããã«ãSELECT æã¯éåžžã®åãã¯ãšãªãããšããšäœã代ãããããŸãããåºåçµæã¯ä»¥äžã®ããã«ãªããé
åå
ã®å
šãŠã®å€ãè¿ããŸãã (è¡çªå·) name subjects 1 ç°äž 倪é åœèª ç®æ° çç§ ç€ŸäŒ 2 éŽæš äºé åœèª ç®æ° SELECT ã WHERE WHERE å¥ã§ãã£ã«ã¿ãããããšèãããšããæåã®å£ã«åœãããŸãã SELECT name, subjects FROM t0 WHERE subjects = " çç§ " ; ãã® SQL ã¯ã以äžã®ãããªãšã©ãŒã«ãªããŸãã No matching signature for operator = for argument types: ARRAY<STRING>, STRING. Supported signature: ANY = ANY at [17:3] = ã®å·ŠèŸºãšå³èŸºã§ç°ãªãå (巊蟺㯠ARRAY ã§ãã subjects åãå³èŸºã¯ STRING) ãæå®ããŠããããšãããšã©ãŒã«ãªã£ãŠããŸãããªãå³èŸºã ["åœèª", "ç®æ°"] ã®ããã«é
åã«ããŠããšã©ãŒã«ãªããŸã ( Equality is not defined for arguments of type ARRAY<STRING> at [7:5] )ã = æŒç®åã¯ããããé
ååããµããŒãããŠããŸããã äžæ¹ã§ã以äžã®ã¯ãšãªã¯æåããŸãã SELECT name, subjects FROM t0 WHERE " çç§ " IN UNNEST(subjects); (è¡çªå·) name subjects 1 ç°äž 倪é åœèª ç®æ° çç§ ç€ŸäŒ ããã§ã¯ UNNEST 颿°ãçšããŠããŸããUNNEST() ã¯é
åå
ã®å
šèŠçŽ ãåè¡ã«å²ãæ¯ã£ããããŒãã«ããè¿ããŸãã以äžã®äŸãèŠãŠãã ããã SELECT * FROM UNNEST([ 1 , 2 , 3 ]); (è¡çªå·) f0_ 1 1 2 2 3 3 ãã®ããã«é
åã UNNEST() ããããšãåèŠçŽ ã1è¡1è¡ã«å²ãæ¯ããããããŒãã«åœ¢åŒãã«ãªãããšãåãããŸããå
çšã® WHERE å¥ã§ã¯ UNNEST() ã§ subjects åã®äžèº«ãåè§£ããŠããŒãã«åãããã®çµæã®äžã« "çç§" ãå«ãŸããŠãããã IN æŒç®åã§æ€æ»ããŠãTRUE ãšãªã£ãè¡ã ããè¿ããã®ã§ãã åè : é
åå
ã®èŠçŽ ãããŒãã«å
ã®è¡ã«å€æãã SELECT ã CROSS JOIN é
ååãå«ãããŒãã«ã«èªåšã«ãã£ã«ã¿ãè¡ãã«ã¯ãUNNEST() ãš CROSS JOIN ã䜿ãããªãå¿
èŠããããŸãã äžäŸã瀺ããŸãã SELECT name, unnested_subject FROM t0 CROSS JOIN UNNEST(subjects) AS unnested_subject; (è¡çªå·) name unnested_subject 1 ç°äž 倪é åœèª 2 ç°äž 倪é ç®æ° 3 ç°äž 倪é çç§ 4 ç°äž 倪é ç€ŸäŒ 5 éŽæš äºé åœèª 6 éŽæš äºé ç®æ° äžèšã®ã¯ãšãªã§ã¯å
ããŒãã«ã®å
šè¡ã«å¯ŸããŠ1è¡ãã€ãsubjects ã UNNEST ããŠè¿ã£ãŠããããŒãã«ãã CROSS JOIN ããŠããŸããããã«ãããé
åãåè§£ãããŠéåžžã®ç¬¬1æ£èŠåãããããŒãã«ã®ããã«ãªããWHERE ã§ãã£ã«ã¿ã§ããŸãã SELECT (SELECT ~ UNNEST) 以äžã®ãããªã¯ãšãªãçšããããšãã§ããŸãã SELECT name, ( SELECT * FROM UNNEST(subjects) AS u WHERE u = " çç§ " ) AS subject_science FROM t0; (è¡çªå·) name subject_science 1 ç°äž 倪é çç§ 2 éŽæš äºé null SELECT å¥å
ã®ãµãã¯ãšãªã® SELECT ã¯ãUNNEST() ãã subjects åã察象ãšããŠããããã®çµæã¯ WHERE ã§ "çç§" ã ãã«çµãããŠããŸãã subjects åã "çç§" ã®å€ãæã£ãŠããªãè¡ã¯ null ãšããŠè¿ããŸãã ãã ããã®äŸã¯ã (SELECT * FROM UNNEST(subjects) AS u WHERE u = "çç§") ã®çµæãåäžè¡ã ãè¿ã (ã¹ã«ã©å€ã§ãã) ããšãåæã§ããããé
åã« "çç§" ãè€æ°ããå Žåã Scalar subquery produced more than one element ãšã©ãŒãçããŠããŸããŸãã äŸãã°ä»¥äžã®ããã«ãããŒã¿ãéè€ããŠããŸã£ãŠããããŒãã«ã®å Žåã§ãã (è¡çªå·) name subjects 1 ç°äž 倪é åœèª ç®æ° çç§ ç€ŸäŒ 2 éŽæš äºé åœèª ç®æ° 3 äžäž äžé åœèª çç§ çç§ äžäž äžéã® subjects åã«çç§ã2è¡ãããããUNNEST ã«å¯Ÿãã SELECT çµæã2è¡ã«ãªã£ãŠããŸããã¯ãšãªã倱æããŸãã ãã®ãããªããŒã¿ã®äžæŽåãããå¯èœæ§ã«å¯Ÿå¿ããã«ã¯ã以äžã®ããã«ããŸãã SELECT name, ( SELECT DISTINCT * FROM UNNEST(subjects) AS u WHERE u = " çç§ " ) AS subject_science FROM t0; (è¡çªå·) name subjects 1 ç°äž 倪é çç§ 2 éŽæš äºé null 3 äžäž äžé çç§ DISTINCT ããããšã§è¿åŽçµæãäžæã«çµããããšã©ãŒã«ãªããŸããã CREATE TABLE / INSERT é åºãšããŠã¯ãã¹ãã¹ã§ãããARRAY ãæã€è¡šã® CREATE TABLE ããã³ INSERT æã玹ä»ããŸãã CREATE TABLE ã¯ã·ã³ãã«ã§ããARRAY ã®åã ARRAY<(åå)> ãšããŠå®çŸ©ããã®ã¿ã§ãã CREATE TABLE `my-project.my_dataset.t0` ( name STRING, subjects ARRAY<STRING> ); INSERT æã¯ä»¥äžã§ãã INSERT `my-project.my_dataset.t0` VALUES ( " éŽæš äºé " , [ " åœèª " , " ç®æ° " ]); äžèšã® ["åœèª", "ç®æ°"] ã ARRAY["åœèª", "ç®æ°"] ã ARRAY<STRING>["åœèª", "ç®æ°"] ã®ããã«è¡šçŸããããšãã§ããŸã (æå³ã¯å€ãããŸãã)ã å¶é é
åã®é
åãäœãããšã¯ã§ããŸãããã€ãŸãã以äžã®ããã«ãã¹ãããé
åã¯äœããŸããã SELECT [ " hogehoge " , [ " foo " , " bar " ]]; Cannot construct array with element type ARRAY<STRING> because nested arrays are not supported at [2:16] äžæ¹ã§é
åã®äžã«ãåŸã«ç޹ä»ãã STRUCT åã¯å
¥ããããšãã§ããŸããããã Google Analytics 4 ã® BigQuery Export çã§èŠãããç¬ç¹ãªæ§æã§ããããã«ã€ããŠã¯åŸã«è§£èª¬ããŸãã SELECT [ STRUCT( " hoge01 " AS f1, " fuga01 " AS f2), STRUCT( " hoge02 " , " fuga02 " ) ] AS arrayed_struct; (è¡çªå·) arrayed_struct.f1 arrayed_struct.f2 1 hoge01 fuga01 hoge02 fuga02 STRUCT (æ§é äœ) STRUCT ãšã¯ BigQuery ã® STRUCT (æ§é äœ) åã¯ãæ§é ãæã£ãåã§ãäžã€ä»¥äžã®ãã£ãŒã«ããæã€ããšãã§ããŸãã äŸãã°ä»¥äžã®è¡šã§ã¯ãitem ãšããåã STRUCT åã§ãid ãšãã INT64 åã®ãã£ãŒã«ããšãname ãšãã STRING åã®ãã£ãŒã«ããæã£ãŠããŸãã price item.id item.name 3000 10001 T-shirt 8000 20001 jacket STRUCT ã¯ããŒã¿ãæ§é çã«æŽçããããã«æçšã§ãã åè : Struct type åè : æ§é äœãªãã©ã« ãµã³ãã«ããŒãã« STRUCT åãæã€ããŒãã«ã®äŸãšããŠã以äžã® WITH å¥ãä»®æ³çãªãµã³ãã«ããŒãã«ãšããŠäœ¿ããŸãã school åã STRUCT åã§ããã£ãŒã«ããšã㊠year (INT64 å) ãš class (STRING å) ãæã£ãŠããŸãã WITH t1 AS ( SELECT " ç°äž 倪é " AS name, STRUCT( 1 AS year, " B " AS class) AS school UNION ALL SELECT " éŽæš äºé " AS name, STRUCT( 2 AS year, " C " AS class) AS school ) SELECT * FROM t1; (è¡çªå·) name school.year school.class 1 ç°äž 倪é 1 B 2 éŽæš äºé 2 C SELECT STRUCT åã«å¯Ÿãã SELECT ã¯ãä»ã®éåžžã®åãšå€§ããå€ãããªããããçŽæçã«çè§£ã§ããŸãã ãã®ãããªããŒãã«ã«å¯Ÿããã¯ãšãªã¯ä»¥äžã®ããã«ãªããŸãã SELECT name, school FROM t1; (è¡çªå·) name school.year school.class 1 ç°äž 倪é 1 B 2 éŽæš äºé 2 C school ãšããååãæå®ããã ãã§ãé
äžã®ãã£ãŒã«ãã®å
šãŠãéžæãããŸãã 以äžã®ããã«ããã£ãŒã«ãåãæç€ºã㊠SELECT ããããšãå¯èœã§ãã SELECT name, school.year FROM t1; (è¡çªå·) name year 1 ç°äž 倪é 1 2 éŽæš äºé 2 ãªããã®å Žåãè¿åŽçµæã®ååã¯ãã£ãŒã«ãåã ãã«ãªããŸãã SELECT ã WHERE ARRAY ãšç°ãªããSTRUCT åãžã® WHERE å¥ã®äœ¿çšã¯çŽæçã§ãã SELECT name, school FROM t1 WHERE school.year = 1 ; (è¡çªå·) name school.year school.class 1 ç°äž 倪é 1 B WHERE å¥ã§ãã£ãŒã«ãã«å¯ŸããŠæ¡ä»¶ãæå®ããã ãã§ããã£ã«ã¿ãããããšãã§ããŸãã CREATE TABLE / INSERT STRUCT åãæã€ããŒãã«ã® CREATE TABLE æã¯ã以äžã®ããã«èšè¿°ããŸããSTRUCT<(ãã£ãŒã«ãå) (åå), (ãã£ãŒã«ãå) (åå), ...> ã®ããã«åãã£ãŒã«ãã®ååãšåãæå®ããŸãã CREATE TABLE `my-project.my_dataset.t1` ( name STRING, school STRUCT<year INT64, class STRING> ); INSERT æã¯ä»¥äžã§ãã INSERT INTO `my-project.my_dataset.t1` VALUES ( " éŽæš äºé " , STRUCT( 2 AS year, " C " AS class)); ãªã AS year AS class ã®ãããªãã£ãŒã«ãåæå®ã¯çç¥å¯èœã§ãå®ã¯å¯èªæ§ãé«ãã以å€ã®æå³ã¯ãããŸããããã£ãŒã«ãåãæå®ãããšããã§èšèŒé çªãåªå
ãããŸããããªãã¡äžèšã "C" AS class, 2 AS year ãšæžãæãããšãåãšã©ãŒã«ãªããŸããéã«ãåãåãã ãšæå³ããªãåã«å€ãå
¥ã£ãŠããŸããŸãã 以äžã®ããã«ç°¡æçã«èšè¿°ããããšãã§ããŸãã INSERT INTO `my-project.my_dataset.t1` VALUES ( " éŽæš äºé " , ( 2 , " C " )); å¶é STRUCT åã¯ãã¹ãããããšãã§ããŸãããæå€§ã§15段éãŸã§ã§ãã ãã¹ããã STRUCT åã®äŸã¯ä»¥äžã§ãã SELECT STRUCT( 1001 AS f_int, " hoge " AS f_string, STRUCT( " foo " AS f1, " bar " AS f2 ) AS f_struct ) AS root; (è¡çªå·) root.f_int root.f_string root.f_struct.f1 root.f_struct.f2 1 1001 hoge foo bar ARRAY<STRUCT> (ãã¹ããããç¹°ãè¿ãå) ARRAY<STRUCT> ãšã¯ ARRAY<STRUCT> (ãã¹ããããç¹°ãè¿ãå) ãšã¯ãããŸã§ç޹ä»ãã ARRAY ãš STRUCT ãçµã¿åããããã®ã§ãã ARRAY ã®åã®äžã«ãèŠçŽ ãšã㊠STRUCT åãå
¥ã£ãŠãããã®ã§ããGoogle Analytics 4 (Firebase) ã Google Cloud ã® Billing Export ã§ãã®åœ¢åŒãèŠãããŸãã å®äŸãšããŠã¯ã以äžã®ãããªãã®ã§ãã (è¡çªå·) name classes.subject classes.teacher 1 ç°äž 倪é åœèª æè€ äžé è±èª äŒæ± åæ 2 éŽæš äºé è±èª äŒæ± åæ classes å㯠ARRAY (é
å) åã§ããããã®åèŠçŽ ã¯ subject ãš teacher ãšãããã£ãŒã«ããæã€ STRUCT åã§ãã åè : ããŒãã« ã¹ããŒãã§ãã¹ããããåãšç¹°ãè¿ãåãæå®ãã ãµã³ãã«ããŒãã« ãµã³ãã«ããŒãã«ãšããŠã以äžã® WITH å¥ã䜿ã£ãŠè©ŠããŠãã ããã classes åãããã¹ããããç¹°ãè¿ãåãã§ããé
åã§ãããåèŠçŽ ã¯ subject ãšãã STRING åãã£ãŒã«ããš teacher ãšãã STRING åãã£ãŒã«ããæã£ã STRUCT ã§ãã WITH t2 AS ( SELECT " ç°äž 倪é " AS name, [ STRUCT( " åœèª " AS subject, " æè€ äžé " AS teacher), STRUCT( " è±èª " AS subject, " äŒæ± åæ " AS teacher) ] AS classes UNION ALL SELECT " éŽæš äºé " AS name, [ STRUCT( " è±èª " AS subject, " äŒæ± åæ " AS teacher) ] AS classes ) SELECT * FROM t2; (è¡çªå·) name classes.subject classes.teacher 1 ç°äž 倪é åœèª æè€ äžé è±èª äŒæ± åæ 2 éŽæš äºé è±èª äŒæ± åæ SELECT classes åãæå®ã㊠SELECT ããããšã¯å¯èœã§ãã SELECT name, classes FROM t2; ãããã以äžã®ããã« classes åã®ãã£ãŒã«ããæå®ããŠã¯ãšãªããããšãããšããšã©ãŒã«ãªããŸãã SELECT name, classes.subject FROM t2; Cannot access field subject on a value with type ARRAY<STRUCT<subject STRING, teacher STRING>> at [18:11] classes 㯠ARRAY ã§ããclasses åã® subject ã ããåãåºãããå Žåã以äžã®ããã« UNNEST() ããŠããŒãã«åãããããã subject åã ããåãåºãããšãã§ããŸããARRAY ãå
é ã«ã€ããªããšãåäœã®å€ (ã¹ã«ã©å€) ãè¿ã£ãŠããããšãæåŸ
ãã Scalar subquery produced more than one element ã«ãªã£ãŠããŸããããARRAY() ãšããŠæ»ããé
åã§ããããšãæç€ºããŸãã SELECT name, ARRAY( SELECT subject FROM UNNEST(classes)) AS subject FROM t2; (è¡çªå·) name subject 1 ç°äž 倪é åœèª è±èª 2 éŽæš äºé è±èª SELECT ã WHERE (ãšã©ãŒ) WHERE ã䜿ã£ããã£ã«ã¿ãç¬ç¹ã§ãã以äžã®ã¯ãšãªã¯ãšã©ãŒã«ãªããŸãã SELECT name, classes FROM t2 WHERE classes.subject = " åœèª " ; Cannot access field subject on a value with type ARRAY<STRUCT<subject STRING, teacher STRING>> at [22:11] å
çšãšåãçç±ã§ãé
åã§ãã classes ã®äžèŠçŽ ã® subject ãã£ãŒã«ãã«ã¯ã¢ã¯ã»ã¹ã§ããŸããã ARRAY<STRUCT> ããã£ã«ã¿ããã«ã¯ã次ã«ç€ºããããªã¯ãšãªãçšããŸãã SELECT ã CROSS JOIN 以äžã®ã¯ãšãªã¯éããŸãã SELECT name, c.subject, c.teacher FROM t2 CROSS JOIN UNNEST(classes) AS c WHERE c.subject = " åœèª " ; (è¡çªå·) name subject teacher 1 ç°äž 倪é åœèª æè€ äžé ARRAY ã§ãã classes åãæ¯è¡ unnest ã㊠CROSS JOIN ãã第1æ£èŠåãããç¶æ
ã®ããŒãã«ã« WHERE ã§ãã£ã«ã¿ããããŠããŸãã SELECT (SELECT ~ UNNEST) 以äžãããªã¯ãšãªãã§ããŸãã SELECT name, ( SELECT AS STRUCT subject, teacher FROM UNNEST(classes) WHERE subject = " åœèª " ) AS class FROM t2; (è¡çªå·) name class.subject class.teacher 1 ç°äž 倪é åœèª æè€ äžé 2 éŽæš äºé null null ãã¡ãããã£ãŠããããšã¯äŒŒãŠãããSELECT å¥ã®äžã®ãµãã¯ãšãªã§æ¯è¡ classes ã UNNEST ã㊠subject ãš teacher ãåãåºãããã®çµæã WHERE å¥ã§çµã£ãŠããŸãã SELECT ã§æå®ããåã¯åäžã®å€ (ã¹ã«ã©å€) ãæåŸ
ããã®ã§ SELECT AS STRUCT ã䜿ãããšã§ãæ»ãã STRUCT ã§ããããšãæç€ºçã«æç€ºããŠããŸãã AS STRUCT ãã€ããªããšä»¥äžã®ãããªãšã©ãŒã«ãªããŸãã Scalar subquery cannot have more than one column unless using SELECT AS STRUCT to build STRUCT values at [18:3] ããã㯠AS STRUCT ãã€ããªããŠããSELECT ããåã subject ã teacher ã®äžã€ã ãã§ããã°ãšã©ãŒã«ãªããŸããã CREATE TABLE / INSERT ARRAY<STRUCT> ã® CREATE TABLE æã¯ä»¥äžã®ããã«ãªããŸãã CREATE TABLE `my-project.my_dataset.t2` ( name STRING, classes ARRAY< STRUCT< subject STRING, teacher STRING > > ); INSERT æã¯ä»¥äžã§ãã INSERT `my-project.my_dataset.t2` VALUES ( " ç°äž 倪é " , [ STRUCT( " åœèª " AS subject, " æè€ äžé " AS teacher ), STRUCT( " è±èª " AS subject, " äŒæ± åæ " AS teacher ) ] ); ãªãéåžžã® STRUCT åãšåãã§ AS subject AS teacher ã®ãããªãã£ãŒã«ãåã®æå®ã¯çç¥å¯èœã§ããããã¹ããŒãå®çŸ©ãšåãé çªã§èšèŒããå¿
èŠããããŸãã å®è·µ : Google Analytics 4 ããŒã¿ãžã®ã¯ãšãª æŠèŠ Google Analytics 4 (GA4) ã Firebase ã§ã¯ã¢ã¯ã»ã¹æ
å ±ã BigQuery ã«ãšã¯ã¹ããŒãããããšãã§ããŸããç°¡åãªèšå®ã§ BigQuery ã«å®æçã«ããŒã¿ãåãåºããŠãããã®ã§äŸ¿å©ã§ããããã®ã¹ããŒãã«ã¯åœèšäºã§ç޹ä»ãã ARRAY<STRUCT> ã䜿ãããŠãããã¯ãšãªã®ä»æ¹ãç¬ç¹ã§ãã åœé
ç®ã§ã¯ãGA4 ã®ãšã¯ã¹ããŒãããŒã¿ã®ããŒãã«ãæš¡ããããŒãã«ã«å¯Ÿããã¯ãšãªã®æ¹æ³ãç°¡åã«ã玹ä»ããŸãã åè : [GA4] BigQuery Export åè : [GA4] BigQuery Export ã¹ããŒã åè : Firebase ã® BigQuery Export ããŒãã«äŸ 以äžã®ãããªæš¡æ¬ããŒãã«ãçšããŸãã ãã£ãŒã«ãå çš®é¡ ã¢ãŒã event_timestamp INTEGER NULLABLE event_name STRING NULLABLE event_params RECORD (=STRUCT) REPEATED (=ARRAY) â key STRING NULLABLE â value RECORD (=STRUCT) NULLABLE ãâ string_value STRING NULLABLE ãâ int_value INTEGER NULLABLE ãâ float_value FLOAT NULLABLE ãâ double_value FLOAT NULLABLE ããŒã¿ã¯ä»¥äžã®ããã«å
¥ã£ãŠããŸãã GA4 ããŒã¿ãæš¡ããããŒãã« ã¯ãšãªäŸ1: ç¹å®ããŒãžã® PV æ°ãéèš ç¹å®ããŒãžã® PV æ°ãèšæž¬ãããã event_name ã "page_view" ã§ãã〠page_location ã "https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision" ãšããæååãšãªã£ãŠããã¬ã³ãŒããéžæããããšããŸãã 以äžã®ããã«ããããšããã§ããããšã©ãŒã«ãªããŸãã SELECT COUNT (*) AS pv FROM `my-project.my_dataset.ga4_mock` WHERE event_name = " page_view " AND event_params.value.string_value = " https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision " ; Cannot access field value on a value with type ARRAY<STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64, float_value FLOAT64, ...>>> at [8:16] ãã£ã«ã¿å¯Ÿè±¡ã® event_params 㯠ARRAY ã§ããããã®èŠçŽ ã§ãã event_params.value 㯠STRUCT åã§ãããã®ãã£ãŒã«ãã®äžã€ã string_value ã§ããã©ã®ããã«ã¯ãšãªããã°è¯ãã®ããé ããããããã£ãŠããŸããŸãã 以äžã®ãããªã¯ãšãªãéããŸãã SELECT COUNT (*) AS pv FROM `my-project.my_dataset.ga4_mock` WHERE event_name = " page_view " AND " https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision " IN ( SELECT value.string_value FROM UNNEST (event_params) WHERE key = " page_location " ) (è¡çªå·) pv 1 1 ãã®ã¯ãšãªã§ã¯ãevent_name åã "page_view" ã®è¡ã«å¯Ÿããé
åã§ãã event_param åã UNNEST ããŠå¹³æºåããŒãã«ãšãããã®äžã§ key ã "page_location" ã§ããè¡ã® value.string_value ãã£ãŒã«ãã IN ã§æ€æ»ããŠããŸãã ãŸã奿¡ãšããŠã以äžã®ãããªãã¥ãŒãäœã£ãŠããŸãã®ãæã§ãã SELECT event_timestamp, event_name, ( SELECT value.string_value FROM UNNEST(event_params) WHERE key = " page_location " ) AS page_location FROM `my-project.my_dataset.ga4_mock` WHERE event_name = " page_view " ; (è¡çªå·) event_timestamp event_name page_location 1 1695781266341693 page_view https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision ãã®ããã« page_view ã€ãã³ãã® page_location å€ã®ãã¥ãŒã ããäœã£ãŠããŸãã°ãããšã¯äžè¬ç㪠SQL ã§ã¯ãšãªã§ããŸãã CREATE VIEW AS ã§ãã¥ãŒãäœãããäžæçã»æ¢çŽ¢çãªã¯ãšãªãªã WITH å¥ã䜿ã£ãŠãè¯ãã§ãããã WITH unnested_view AS ( SELECT event_timestamp, event_name, ( SELECT value.string_value FROM UNNEST(event_params) WHERE key = " page_location " ) AS page_location FROM `my-project.my_dataset.ga4_mock` WHERE event_name = " page_view " ) SELECT COUNT (*) AS pv FROM unnested_view WHERE page_location = " https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision " ; (è¡çªå·) pv 1 1 äžèšã®ããã« UNNEST ããŠå¹³åŠåããç¶æ
ãããŒã¿ããŒãããã¥ãŒãšããŠæã£ãŠããã°ãBI ããŒã«ã Connected Sheets ãããå©çšãããããªããŸãã ãã®ããã« ARRAY åã ARRAY<STRUCT> åã¯ãSELECT å¥ãŸã㯠WHERE å¥ã®ãµãã¯ãšãªã§ UNNEST() 颿°ã䜿ãããšã§ãèªåšã«æ±ãããšãã§ããŸãã ã¯ãšãªäŸ2 : string_value ãåãåºã颿°ãäœã åè¿°ã®äŸã ãšãµãã¯ãšãªãé·ããå¯èªæ§ã«å£ããŸããUNNEST() ããåŠçã颿°ã«åãåºããŠå¯èªæ§ãé«ããŠã¿ãŸãã CREATE TEMP FUNCTION getStringValue(col ANY TYPE , col_key STRING) AS ( ( SELECT c.value.string_value FROM UNNEST(col) c WHERE c.key = col_key) ); SELECT event_timestamp, event_name, getStringValue(event_params, " page_title " ) AS page_title, getStringValue(event_params, " page_location " ) AS page_location FROM `my-project.my_dataset.ga4_mock` çµæã¯ä»¥äžã®ããã«ãªããŸãã (è¡çªå·) event_timestamp event_name page_title page_location 1 1695781266341693 page_view ãã«ãªã¯ãšã¹ããããªã¬ãšããCloud Runã®ãã¬ãã¥ãŒç°å¢èªåãããã€ãå®è£
ããŠã¿ã - G-gen Tech Blog https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision 2 1695781266341693 first_visit ãã«ãªã¯ãšã¹ããããªã¬ãšããCloud Runã®ãã¬ãã¥ãŒç°å¢èªåãããã€ãå®è£
ããŠã¿ã - G-gen Tech Blog https://blog.g-gen.co.jp/entry/deploy-preview-using-cloud-run-tagged-revision ã¹ããŒãè¡šèš æŠèŠ BigQuery ã§ã®ã¹ããŒã衚èšã¯ãSQL äžã®è¡šèšããšãWeb ã³ã³ãœãŒã«ã JSON 圢åŒã§ã®è¡šèšããç°ãªãå ŽåããããŸãã äŸãã°åè¿°ã® ARRAY<STRUCT> ã¯ãã¿ã€ãã RECORD ã§ã¢ãŒãã REPEATEDãã®ããã«è¡šçŸãããŸãã åè : ã¹ããŒãã®æå® ä»¥äžã«åèæ
å ±ãšããŠèšèŒããŸãã ARRAY BigQuery ã³ã³ãœãŒã«äžã JSON 圢åŒã§ã®ã¹ããŒã衚çŸã§ã¯ããããŸã§æ±ã£ããã㪠ARRAY ã¯ä»¥äžã®ããã«ãçš®é¡ã (é
åå
ã®ããŒã¿ã®åå) ã§ã¢ãŒãã REPEATED ããšããŠè¡šçŸãããŸãã é
åã¯ãã¢ãŒããã REPEATED ã«ãªã£ãŠãã { ãç¥ã " schema ": { " fields ": [ { " name ": " name ", " type ": " STRING " } , { " mode ": " REPEATED ", " name ": " subjects ", " type ": " STRING " } ] } , ãç¥ã } STRUCT BigQuery ã³ã³ãœãŒã«äžã JSON 圢åŒã§ã®ã¹ããŒã衚çŸã§ã¯ãSTRUCT ã¯ä»¥äžã®ããã«ãçš®é¡ã RECORD ã§ã¢ãŒãã NULLABLE/REQUIREDããšããŠè¡šçŸãããŸãã STRUCT 㯠RECORD ãšããçš®é¡ãšããŠè¡šèš { ãç¥ã " schema ": { " fields ": [ { " name ": " name ", " type ": " STRING " } , { " fields ": [ { " name ": " year ", " type ": " INTEGER " } , { " name ": " class ", " type ": " STRING " } ] , " name ": " school ", " type ": " RECORD " } ] } , ãç¥ã } ARRAY<STRUCT> BigQuery ã³ã³ãœãŒã«äžã JSON 圢åŒã§ã®ã¹ããŒã衚çŸã§ã¯ã ARRAY<STRUCT> ã¯ä»¥äžã®ããã«ãçš®é¡ã RECORD ã§ã¢ãŒãã REPEATED ããšããŠè¡šçŸãããŸããRECORD 㯠STRUCT ãšãREPEATED 㯠ARRAY ãšå矩ã§ãã ãçš®é¡ãã RECORD (=STRUCT)ããã¢ãŒããã REPEATED (=ARRAY) JSON ã§ã¯ä»¥äžã®ããã«ãªããŸãã { ãç¥ã " schema ": { " fields ": [ { " name ": " name ", " type ": " STRING " } , { " fields ": [ { " name ": " subject ", " type ": " STRING " } , { " name ": " teacher ", " type ": " STRING " } ] , " mode ": " REPEATED ", " name ": " classes ", " type ": " RECORD " } ] } , ãç¥ã } ææ å銬 (èšäºäžèЧ) å·è¡åœ¹å¡ CTO / ã¯ã©ãŠããœãªã¥ãŒã·ã§ã³éš éšé· å
èŠå¯å®ãšããçµæŽãæã€çŸ IT ãšã³ãžãã¢ãã¯ã©ãŠã管çã»éçšããããã¯ãŒã¯ã«ç¥èŠãAWS 12è³æ ŒãGoogle Cloudèªå®è³æ Œ11è³æ ŒãX (æ§ Twitter) ã§ã¯ Google Cloud ã AWS ã®ã¢ããããŒãæ
å ±ãã€ã¶ãããŠããŸãã Follow @y_sugi_it