[{"data":1,"prerenderedAt":4043},["ShallowReactive",2],{"/ja-jp/blog/how-gitlab-duo-agent-platform-transforms-dataops":3,"navigation-ja-jp":3262,"banner-ja-jp":3691,"footer-ja-jp":3700,"blog-post-authors-ja-jp-Dennis van Rooijen":3942,"blog-related-posts-ja-jp-how-gitlab-duo-agent-platform-transforms-dataops":3958,"blog-promotions-ja-jp":3982,"next-steps-ja-jp":4034},{"id":4,"title":5,"authors":6,"body":8,"category":3244,"date":3245,"description":3246,"extension":3247,"externalUrl":3248,"faq":3248,"featured":247,"heroImage":3249,"meta":3250,"navigation":247,"path":3251,"seo":3252,"slug":3253,"stem":3254,"tags":3255,"template":3259,"updatedDate":3260,"__hash__":3261},"blogPosts/ja-jp/blog/how-gitlab-duo-agent-platform-transforms-dataops.md","GitLab Duo Agent PlatformがDataOpsを変革する方法",[7],"Dennis van Rooijen",{"type":9,"value":10,"toc":3224},"minimark",[11,15,25,29,38,61,68,77,80,108,111,115,124,277,280,294,312,316,324,336,339,343,346,354,357,383,387,390,455,458,461,517,523,527,534,539,792,797,1008,1013,1146,1150,1205,1209,1218,1224,1227,1241,3058,3064,3067,3087,3091,3105,3108,3111,3114,3117,3128,3134,3137,3148,3151,3162,3166,3177,3180,3183,3186,3192,3201,3204,3220],[12,13,14],"p",{},"dbtモデルの手動作成は、データエンジニアにとって何時間も取られる単調な作業です。特に大きなビジネス変換がない場合、エンジニアのデータ業務の中でも最もやりがいを感じにくい部分と言えるでしょう。",[12,16,17,18,24],{},"しかし、このプロセス全体を自動化できるとしたらどうでしょうか？本ブログでは、",[19,20,23],"a",{"href":21,"rel":22},"https://about.gitlab.com/gitlab-duo-agent-platform/",[],"GitLab Duo Agent Platform","を使用して、適切な構造、テスト、ドキュメントを含む包括的なdbtモデルをわずか数分で生成する方法を詳しく解説します。",[26,27,28],"h2",{"id":28},"何を構築するのか",[12,30,31,32,37],{},"マーケティングチームは、広告投資を効果的に管理・最適化したいと考えています。広告プラットフォームの一つがRedditであるため、Reddit Ads APIからエンタープライズ",[19,33,36],{"href":34,"rel":35},"https://handbook.gitlab.com/handbook/enterprise-data/platform/",[],"データプラットフォーム","Snowflakeにデータを抽出しています。GitLabでは、3つのストレージレイヤーがあります：",[39,40,41,49,55],"ol",{},[42,43,44,48],"li",{},[45,46,47],"code",{},"raw","レイヤー - 外部ソースからの未処理データの最初の着陸地点。ビジネス用途に準備されていない",[42,50,51,54],{},[45,52,53],{},"prep","レイヤー - ソースモデルを含む最初の変換レイヤー。まだ一般的なビジネス用途には準備されていない",[42,56,57,60],{},[45,58,59],{},"prod","レイヤー - ビジネス用途とTableauレポート用に準備された最終変換データ",[12,62,63],{},[64,65],"img",{"alt":66,"src":67},"ストレージレイヤーのチャート","https://res.cloudinary.com/about-gitlab-com/image/upload/v1758030995/zo7vespktzfdtdtiauz7.png",[12,69,70,71,73,74,76],{},"この実践ガイドでは、データは既に抽出ツールFivetranによってrawレイヤーに配置されており、",[45,72,53],{},"レイヤーから",[45,75,59],{},"レイヤーまでデータを処理するdbtモデルを生成します。",[12,78,79],{},"一行のdbtコードを自分で書くことなく、このガイドを最後まで進めると以下が完成します：",[81,82,83,90,96,102],"ul",{},[42,84,85,86],{},"prepレイヤーの",[87,88,89],"strong",{},"ソースモデル",[42,91,92,93],{},"prodレイヤーの",[87,94,95],{},"ワークスペースモデル",[42,97,98,99],{},"Reddit Adsデータセットのすべての13テーブル（112列を含む）の",[87,100,101],{},"完全なdbt構成",[42,103,104,105],{},"結果を検証する",[87,106,107],{},"テストクエリ",[12,109,110],{},"プロセス全体は10分以内で完了します。手動では通常数時間かかる作業です。以下の手順に従ってください：",[26,112,114],{"id":113},"_1-データ構造の準備","1. データ構造の準備",[12,116,117,118,123],{},"GitLab Duoがモデルを生成する前に、完全なテーブル構造を理解する必要があります。そこで重要になるのが、Snowflakeの情報スキーマに対してクエリを実行することです。現在、GitLab DuoをModel Context Protocol（",[19,119,122],{"href":120,"rel":121},"https://about.gitlab.com/topics/ai/model-context-protocol/",[],"MCP","）経由でSnowflakeインスタンスに接続する方法を検討中です：",[125,126,131],"pre",{"className":127,"code":128,"language":129,"meta":130,"style":130},"language-sql shiki shiki-themes github-light","SELECT \n    table_name,\n    column_name,\n    data_type,\n    is_nullable,\n    CASE \n        WHEN is_nullable = 'NO' THEN 'PRIMARY_KEY'\n        ELSE NULL \n    END as key_type\nFROM raw.information_schema.columns\n\nWHERE table_schema = 'REDDIT_ADS'\n\nORDER BY table_name, ordinal_position;\n","sql","",[45,132,133,146,152,158,164,170,178,200,211,223,242,249,263,268],{"__ignoreMap":130},[134,135,138,142],"span",{"class":136,"line":137},"line",1,[134,139,141],{"class":140},"sD7c4","SELECT",[134,143,145],{"class":144},"sgsFI"," \n",[134,147,149],{"class":136,"line":148},2,[134,150,151],{"class":144},"    table_name,\n",[134,153,155],{"class":136,"line":154},3,[134,156,157],{"class":144},"    column_name,\n",[134,159,161],{"class":136,"line":160},4,[134,162,163],{"class":144},"    data_type,\n",[134,165,167],{"class":136,"line":166},5,[134,168,169],{"class":144},"    is_nullable,\n",[134,171,173,176],{"class":136,"line":172},6,[134,174,175],{"class":140},"    CASE",[134,177,145],{"class":144},[134,179,181,184,187,190,194,197],{"class":136,"line":180},7,[134,182,183],{"class":140},"        WHEN",[134,185,186],{"class":144}," is_nullable ",[134,188,189],{"class":140},"=",[134,191,193],{"class":192},"sYBdl"," 'NO'",[134,195,196],{"class":140}," THEN",[134,198,199],{"class":192}," 'PRIMARY_KEY'\n",[134,201,203,206,209],{"class":136,"line":202},8,[134,204,205],{"class":140},"        ELSE",[134,207,208],{"class":140}," NULL",[134,210,145],{"class":144},[134,212,214,217,220],{"class":136,"line":213},9,[134,215,216],{"class":140},"    END",[134,218,219],{"class":140}," as",[134,221,222],{"class":144}," key_type\n",[134,224,226,229,233,236,239],{"class":136,"line":225},10,[134,227,228],{"class":140},"FROM",[134,230,232],{"class":231},"sYu0t"," raw",[134,234,235],{"class":144},".",[134,237,238],{"class":231},"information_schema",[134,240,241],{"class":144},".columns\n",[134,243,245],{"class":136,"line":244},11,[134,246,248],{"emptyLinePlaceholder":247},true,"\n",[134,250,252,255,258,260],{"class":136,"line":251},12,[134,253,254],{"class":140},"WHERE",[134,256,257],{"class":144}," table_schema ",[134,259,189],{"class":140},[134,261,262],{"class":192}," 'REDDIT_ADS'\n",[134,264,266],{"class":136,"line":265},13,[134,267,248],{"emptyLinePlaceholder":247},[134,269,271,274],{"class":136,"line":270},14,[134,272,273],{"class":140},"ORDER BY",[134,275,276],{"class":144}," table_name, ordinal_position;\n",[12,278,279],{},"このクエリは以下を取得します：",[81,281,282,285,288,291],{},[42,283,284],{},"すべてのテーブル名と列名",[42,286,287],{},"適切なモデル構造のためのデータ型",[42,289,290],{},"NULL制約",[42,292,293],{},"主キーの識別（このデータセットでは非NULL列）",[12,295,296,299,300,303,304,307,308,311],{},[87,297,298],{},"ポイント："," Reddit Adsデータセットでは、すべての非NULL列が主キーとして機能するパターンになっています。実際に",[45,301,302],{},"ad_group","などのテーブルを確認したところ、このテーブルには2つの非NULL列（",[45,305,306],{},"account_id","と",[45,309,310],{},"id","）があり、両方とも主キーとしてマークされています。このクエリを実行すると112行のメタデータが返されたため、それらをCSVファイルとしてエクスポートしてモデル生成に使用しました。この手動ステップは現在は問題なく機能していますが、MCPを介してデータプラットフォームとGitLab Duoの直接統合を調査して、このプロセスの完全自動化を目指して取り組んでいます。",[26,313,315],{"id":314},"_2-gitlab-duoのセットアップ","2. GitLab Duoのセットアップ",[12,317,318,323],{},[19,319,322],{"href":320,"rel":321},"https://docs.gitlab.com/ja-jp/user/get_started/getting_started_gitlab_duo/",[],"GitLab Duo","と対話する方法は2つあります：",[39,325,326,331],{},[42,327,328],{},[87,329,330],{},"Web UIチャット機能",[42,332,333],{},[87,334,335],{},"Visual Studio Codeプラグイン",[12,337,338],{},"dbtモデルをローカルで実行してテストできるため、VS Codeプラグインを選択しました。",[26,340,342],{"id":341},"_3-効果的なプロンプトの入力","3. 「効果的な」プロンプトの入力",[12,344,345],{},"すべてのdbtコードを生成するために使用した実際のプロンプトは以下の通りです：",[125,347,352],{"className":348,"code":350,"language":351,"meta":130},[349],"language-text","Create dbt models for all the tables in the file structure.csv.（structure.csvファイル内のすべてのテーブルに対してdbtモデルを作成してください）\n\n\nI want to have the source models created, with a filter that dedupes the data based on the primary key. Create these in a new folder reddit_ads.（主キーに基づいてデータの重複を除去するフィルターを使用してソースモデルを作成したいです。これらを新しいフォルダーreddit_adsに作成してください。）\n\nI want to have workspace models created and store these in the workspace_marketing schema.（ワークスペースモデルを作成し、これらをworkspace_marketingスキーマに保存してください。）\n\n\nTake this MR as example: [I've referenced to previous source implementation]. Here is the same done for Source A, but now it needs to be done for Reddit Ads. \n\n（このMRを例として参考にしてください： [以前のソース実装を参照]。これはSource Aで実施した内容ですが、同様の処理をReddit Adsに対して行う必要があります。）\n\n\nPlease check the dbt style guide when creating the code: https://handbook.gitlab.com/handbook/enterprise-data/platform/dbt-guide/（コードを作成する際は、dbtスタイルガイドをチェックしてください）\n","text",[45,353,350],{"__ignoreMap":130},[12,355,356],{},"このプロンプトが効果的だった理由：",[81,358,359,365,371,377],{},[42,360,361,362],{},"ソースモデルとワークスペースモデル両方の",[87,363,364],{},"明確な仕様",[42,366,367,368],{},"以前の類似マージリクエストからの",[87,369,370],{},"参考例",[42,372,373,374],{},"コードの品質と一貫性を確保するための",[87,375,376],{},"スタイルガイド参照",[42,378,379,380],{},"適切な構成管理のための",[87,381,382],{},"特定のスキーマ指定",[26,384,386],{"id":385},"_4-gitlab-duoのプロセス","4. GitLab Duoのプロセス",[12,388,389],{},"プロンプトを送信した後、GitLab Duoが作業を開始しました。生成プロセス全体は数分かかり、その間にGitLab Duoは以下を行いました：",[39,391,392,398,404,410,416,422,427],{},[42,393,394,395],{},"CSV入力ファイルを",[87,396,397],{},"読み取り分析",[42,399,400,401],{},"メタデータから",[87,402,403],{},"テーブル構造を調査",[42,405,406,407],{},"コーディング標準について",[87,408,409],{},"dbtスタイルガイドを参照",[42,411,412,413],{},"適切な構造化のために",[87,414,415],{},"類似のマージリクエストを考慮",[42,417,418,419],{},"すべての13テーブルの",[87,420,421],{},"ソースモデルを生成",[42,423,418,424],{},[87,425,426],{},"ワークスペースモデルを作成",[42,428,429,432,433],{},[87,430,431],{},"dbtサポートファイルを生成","：",[81,434,435,441,448],{},[42,436,437,440],{},[45,438,439],{},"sources.yml","構成",[42,442,443,444,447],{},"テストとドキュメントを含む",[45,445,446],{},"schema.yml","ファイル",[42,449,450,451,454],{},"スキーマ参照で",[45,452,453],{},"dbt_project.yml","を更新",[26,456,457],{"id":457},"結果",[12,459,460],{},"出力は素晴らしいものでした：",[81,462,463,469,487,493,499,505,511],{},[42,464,465,468],{},[87,466,467],{},"変更ファイル1個："," dbt_project.yml（reddit_adsスキーマ構成を追加）",[42,470,471,474],{},[87,472,473],{},"新しいファイル29個：",[81,475,476,482],{},[42,477,478,481],{},[87,479,480],{},"dbtモデル26個","（ソース13個 + ワークスペース13個）",[42,483,484],{},[87,485,486],{},"YAMLファイル3個",[42,488,489,492],{},[87,490,491],{},"900行近くのコード","が自動生成",[42,494,495,496],{},"主キー列の一意制約を含む",[87,497,498],{},"組み込みデータテスト",[42,500,501,502],{},"すべてのモデルと列の",[87,503,504],{},"汎用説明",[42,506,507,508],{},"ソースモデルの",[87,509,510],{},"適切な重複除去ロジック",[42,512,513,514],{},"GitLab dbtスタイルガイドに従った",[87,515,516],{},"クリーンで一貫したコード構造",[125,518,521],{"className":519,"code":520,"language":351,"meta":130},[349],"transform/snowflake-dbt/\n\n├── dbt_project.yml                                                    [MODIFIED]（変更）\n\n└── models/\n    ├── sources/\n    │   └── reddit_ads/\n    │       ├── reddit_ads_ad_group_source.sql                        [NEW]（新規）\n    │       ├── reddit_ads_ad_source.sql                              [NEW]\n    │       ├── reddit_ads_business_account_source.sql                [NEW]\n    │       ├── reddit_ads_campaign_source.sql                        [NEW]\n    │       ├── reddit_ads_custom_audience_history_source.sql         [NEW]\n    │       ├── reddit_ads_geolocation_source.sql                     [NEW]\n    │       ├── reddit_ads_interest_source.sql                        [NEW]\n    │       ├── reddit_ads_targeting_community_source.sql             [NEW]\n    │       ├── reddit_ads_targeting_custom_audience_source.sql       [NEW]\n    │       ├── reddit_ads_targeting_device_source.sql                [NEW]\n    │       ├── reddit_ads_targeting_geolocation_source.sql           [NEW]\n    │       ├── reddit_ads_targeting_interest_source.sql              [NEW]\n    │       ├── reddit_ads_time_zone_source.sql                       [NEW]\n    │       ├── schema.yml                                            [NEW]\n    │       └── sources.yml                                           [NEW]\n    └── workspaces/\n        └── workspace_marketing/\n            └── reddit_ads/\n                ├── schema.yml                                        [NEW]\n                ├── wk_reddit_ads_ad.sql                              [NEW]\n                ├── wk_reddit_ads_ad_group.sql                        [NEW]\n                ├── wk_reddit_ads_business_account.sql                [NEW]\n                ├── wk_reddit_ads_campaign.sql                        [NEW]\n                ├── wk_reddit_ads_custom_audience_history.sql         [NEW]\n                ├── wk_reddit_ads_geolocation.sql                     [NEW]\n                ├── wk_reddit_ads_interest.sql                        [NEW]\n                ├── wk_reddit_ads_targeting_community.sql             [NEW]\n                ├── wk_reddit_ads_targeting_custom_audience.sql       [NEW]\n                ├── wk_reddit_ads_targeting_device.sql                [NEW]\n                ├── wk_reddit_ads_targeting_geolocation.sql           [NEW]\n                ├── wk_reddit_ads_targeting_interest.sql              [NEW]\n                └── wk_reddit_ads_time_zone.sql                       [NEW]\n\n",[45,522,520],{"__ignoreMap":130},[524,525,526],"h3",{"id":526},"生成されたコードのサンプル",[12,528,529,530,533],{},"生成されたコード品質の例をご紹介します。",[45,531,532],{},"time_zone","テーブルについて、GitLab Duoは以下を作成しました：",[12,535,536],{},[87,537,538],{},"Prepレイヤーソースモデル",[125,540,542],{"className":127,"code":541,"language":129,"meta":130,"style":130},"WITH source AS (\n  SELECT *\n  FROM {{ source('reddit_ads','time_zone') }}\n  QUALIFY ROW_NUMBER() OVER (PARTITION BY id ORDER BY _fivetran_synced DESC) = 1\n),\n\n\nrenamed AS (\n  SELECT\n    id::VARCHAR                               AS time_zone_id,\n    code::VARCHAR                             AS time_zone_code,\n    dst_offset::NUMBER                        AS time_zone_dst_offset,\n    is_dst_active::BOOLEAN                    AS is_time_zone_dst_active,\n    name::VARCHAR                             AS time_zone_name,\n    offset::NUMBER                            AS time_zone_offset,\n    _fivetran_synced::TIMESTAMP               AS fivetran_synced_at\n  FROM source\n)\n\n\nSELECT * FROM renamed\n",[45,543,544,558,566,586,628,633,637,641,650,655,669,682,696,710,725,739,754,762,768,773,778],{"__ignoreMap":130},[134,545,546,549,552,555],{"class":136,"line":137},[134,547,548],{"class":140},"WITH",[134,550,551],{"class":144}," source ",[134,553,554],{"class":140},"AS",[134,556,557],{"class":144}," (\n",[134,559,560,563],{"class":136,"line":148},[134,561,562],{"class":140},"  SELECT",[134,564,565],{"class":140}," *\n",[134,567,568,571,574,577,580,583],{"class":136,"line":154},[134,569,570],{"class":140},"  FROM",[134,572,573],{"class":144}," {{ source(",[134,575,576],{"class":192},"'reddit_ads'",[134,578,579],{"class":144},",",[134,581,582],{"class":192},"'time_zone'",[134,584,585],{"class":144},") }}\n",[134,587,588,591,594,597,600,603,606,609,612,614,617,620,623,625],{"class":136,"line":160},[134,589,590],{"class":144},"  QUALIFY ",[134,592,593],{"class":231},"ROW_NUMBER",[134,595,596],{"class":144},"() ",[134,598,599],{"class":140},"OVER",[134,601,602],{"class":144}," (",[134,604,605],{"class":140},"PARTITION",[134,607,608],{"class":140}," BY",[134,610,611],{"class":144}," id ",[134,613,273],{"class":140},[134,615,616],{"class":144}," _fivetran_synced ",[134,618,619],{"class":140},"DESC",[134,621,622],{"class":144},") ",[134,624,189],{"class":140},[134,626,627],{"class":231}," 1\n",[134,629,630],{"class":136,"line":166},[134,631,632],{"class":144},"),\n",[134,634,635],{"class":136,"line":172},[134,636,248],{"emptyLinePlaceholder":247},[134,638,639],{"class":136,"line":180},[134,640,248],{"emptyLinePlaceholder":247},[134,642,643,646,648],{"class":136,"line":202},[134,644,645],{"class":144},"renamed ",[134,647,554],{"class":140},[134,649,557],{"class":144},[134,651,652],{"class":136,"line":213},[134,653,654],{"class":140},"  SELECT\n",[134,656,657,660,663,666],{"class":136,"line":225},[134,658,659],{"class":144},"    id::",[134,661,662],{"class":140},"VARCHAR",[134,664,665],{"class":140},"                               AS",[134,667,668],{"class":144}," time_zone_id,\n",[134,670,671,674,676,679],{"class":136,"line":244},[134,672,673],{"class":144},"    code::",[134,675,662],{"class":140},[134,677,678],{"class":140},"                             AS",[134,680,681],{"class":144}," time_zone_code,\n",[134,683,684,687,690,693],{"class":136,"line":251},[134,685,686],{"class":144},"    dst_offset::",[134,688,689],{"class":140},"NUMBER",[134,691,692],{"class":140},"                        AS",[134,694,695],{"class":144}," time_zone_dst_offset,\n",[134,697,698,701,704,707],{"class":136,"line":265},[134,699,700],{"class":144},"    is_dst_active::",[134,702,703],{"class":140},"BOOLEAN",[134,705,706],{"class":140},"                    AS",[134,708,709],{"class":144}," is_time_zone_dst_active,\n",[134,711,712,715,718,720,722],{"class":136,"line":270},[134,713,714],{"class":140},"    name",[134,716,717],{"class":144},"::",[134,719,662],{"class":140},[134,721,678],{"class":140},[134,723,724],{"class":144}," time_zone_name,\n",[134,726,728,731,733,736],{"class":136,"line":727},15,[134,729,730],{"class":144},"    offset::",[134,732,689],{"class":140},[134,734,735],{"class":140},"                            AS",[134,737,738],{"class":144}," time_zone_offset,\n",[134,740,742,745,748,751],{"class":136,"line":741},16,[134,743,744],{"class":144},"    _fivetran_synced::",[134,746,747],{"class":140},"TIMESTAMP",[134,749,750],{"class":140},"               AS",[134,752,753],{"class":144}," fivetran_synced_at\n",[134,755,757,759],{"class":136,"line":756},17,[134,758,570],{"class":140},[134,760,761],{"class":144}," source\n",[134,763,765],{"class":136,"line":764},18,[134,766,767],{"class":144},")\n",[134,769,771],{"class":136,"line":770},19,[134,772,248],{"emptyLinePlaceholder":247},[134,774,776],{"class":136,"line":775},20,[134,777,248],{"emptyLinePlaceholder":247},[134,779,781,783,786,789],{"class":136,"line":780},21,[134,782,141],{"class":140},[134,784,785],{"class":140}," *",[134,787,788],{"class":140}," FROM",[134,790,791],{"class":144}," renamed\n",[12,793,794],{},[87,795,796],{},"Schema.yml",[125,798,802],{"className":799,"code":800,"language":801,"meta":130,"style":130},"language-yaml shiki shiki-themes github-light","models:\n  - name: reddit_ads_time_zone_source\n    description: Time zone data from Reddit Ads system（Reddit Adsシステムからのタイムゾーンデータ）\n    columns:\n      - name: time_zone_id\n        description: Time zone data from Reddit Ads system（タイムゾーンレコードの一意識別子）\n        data_tests:\n          - unique\n          - not_null\n      - name: time_zone_code\n        description: Code for the time zone（タイムゾーンのコード）\n      - name: time_zone_dst_offset\n        description: Daylight saving time offset for the time zone（タイムゾーンの夏時間オフセット）\n      - name: is_time_zone_dst_active\n        description: Flag indicating if daylight saving time is active（夏時間がアクティブかどうかを示すフラグ）\n      - name: time_zone_name\n        description: Name of the time zone（タイムゾーンの名前）\n      - name: time_zone_offset\n        description: Offset for the time zone（タイムゾーンのオフセット）\n      - name: fivetran_synced_at\n        description: Timestamp when the record was last synced by Fivetran（レコードがFivetranによって最後に同期されたタイムスタンプ）\n\n","yaml",[45,803,804,813,827,837,844,856,866,873,881,888,899,908,919,928,939,948,959,968,979,988,999],{"__ignoreMap":130},[134,805,806,810],{"class":136,"line":137},[134,807,809],{"class":808},"shJU0","models",[134,811,812],{"class":144},":\n",[134,814,815,818,821,824],{"class":136,"line":148},[134,816,817],{"class":144},"  - ",[134,819,820],{"class":808},"name",[134,822,823],{"class":144},": ",[134,825,826],{"class":192},"reddit_ads_time_zone_source\n",[134,828,829,832,834],{"class":136,"line":154},[134,830,831],{"class":808},"    description",[134,833,823],{"class":144},[134,835,836],{"class":192},"Time zone data from Reddit Ads system（Reddit Adsシステムからのタイムゾーンデータ）\n",[134,838,839,842],{"class":136,"line":160},[134,840,841],{"class":808},"    columns",[134,843,812],{"class":144},[134,845,846,849,851,853],{"class":136,"line":166},[134,847,848],{"class":144},"      - ",[134,850,820],{"class":808},[134,852,823],{"class":144},[134,854,855],{"class":192},"time_zone_id\n",[134,857,858,861,863],{"class":136,"line":172},[134,859,860],{"class":808},"        description",[134,862,823],{"class":144},[134,864,865],{"class":192},"Time zone data from Reddit Ads system（タイムゾーンレコードの一意識別子）\n",[134,867,868,871],{"class":136,"line":180},[134,869,870],{"class":808},"        data_tests",[134,872,812],{"class":144},[134,874,875,878],{"class":136,"line":202},[134,876,877],{"class":144},"          - ",[134,879,880],{"class":192},"unique\n",[134,882,883,885],{"class":136,"line":213},[134,884,877],{"class":144},[134,886,887],{"class":192},"not_null\n",[134,889,890,892,894,896],{"class":136,"line":225},[134,891,848],{"class":144},[134,893,820],{"class":808},[134,895,823],{"class":144},[134,897,898],{"class":192},"time_zone_code\n",[134,900,901,903,905],{"class":136,"line":244},[134,902,860],{"class":808},[134,904,823],{"class":144},[134,906,907],{"class":192},"Code for the time zone（タイムゾーンのコード）\n",[134,909,910,912,914,916],{"class":136,"line":251},[134,911,848],{"class":144},[134,913,820],{"class":808},[134,915,823],{"class":144},[134,917,918],{"class":192},"time_zone_dst_offset\n",[134,920,921,923,925],{"class":136,"line":265},[134,922,860],{"class":808},[134,924,823],{"class":144},[134,926,927],{"class":192},"Daylight saving time offset for the time zone（タイムゾーンの夏時間オフセット）\n",[134,929,930,932,934,936],{"class":136,"line":270},[134,931,848],{"class":144},[134,933,820],{"class":808},[134,935,823],{"class":144},[134,937,938],{"class":192},"is_time_zone_dst_active\n",[134,940,941,943,945],{"class":136,"line":727},[134,942,860],{"class":808},[134,944,823],{"class":144},[134,946,947],{"class":192},"Flag indicating if daylight saving time is active（夏時間がアクティブかどうかを示すフラグ）\n",[134,949,950,952,954,956],{"class":136,"line":741},[134,951,848],{"class":144},[134,953,820],{"class":808},[134,955,823],{"class":144},[134,957,958],{"class":192},"time_zone_name\n",[134,960,961,963,965],{"class":136,"line":756},[134,962,860],{"class":808},[134,964,823],{"class":144},[134,966,967],{"class":192},"Name of the time zone（タイムゾーンの名前）\n",[134,969,970,972,974,976],{"class":136,"line":764},[134,971,848],{"class":144},[134,973,820],{"class":808},[134,975,823],{"class":144},[134,977,978],{"class":192},"time_zone_offset\n",[134,980,981,983,985],{"class":136,"line":770},[134,982,860],{"class":808},[134,984,823],{"class":144},[134,986,987],{"class":192},"Offset for the time zone（タイムゾーンのオフセット）\n",[134,989,990,992,994,996],{"class":136,"line":775},[134,991,848],{"class":144},[134,993,820],{"class":808},[134,995,823],{"class":144},[134,997,998],{"class":192},"fivetran_synced_at\n",[134,1000,1001,1003,1005],{"class":136,"line":780},[134,1002,860],{"class":808},[134,1004,823],{"class":144},[134,1006,1007],{"class":192},"Timestamp when the record was last synced by Fivetran（レコードがFivetranによって最後に同期されたタイムスタンプ）\n",[12,1009,1010],{},[87,1011,1012],{},"Source.yml",[125,1014,1016],{"className":799,"code":1015,"language":801,"meta":130,"style":130},"sources:\n  - name: reddit_ads\n    database: RAW\n    schema: reddit_ads\n    loaded_at_field: _fivetran_synced\n    loader: fivetran\n    description: Reddit Ads data\n\n    quoting:\n      database: true\n      schema: false\n      identifier: false\n\n    tables:\n      - name: time_zone\n\n",[45,1017,1018,1025,1036,1046,1055,1065,1075,1084,1088,1095,1105,1115,1124,1128,1135],{"__ignoreMap":130},[134,1019,1020,1023],{"class":136,"line":137},[134,1021,1022],{"class":808},"sources",[134,1024,812],{"class":144},[134,1026,1027,1029,1031,1033],{"class":136,"line":148},[134,1028,817],{"class":144},[134,1030,820],{"class":808},[134,1032,823],{"class":144},[134,1034,1035],{"class":192},"reddit_ads\n",[134,1037,1038,1041,1043],{"class":136,"line":154},[134,1039,1040],{"class":808},"    database",[134,1042,823],{"class":144},[134,1044,1045],{"class":192},"RAW\n",[134,1047,1048,1051,1053],{"class":136,"line":160},[134,1049,1050],{"class":808},"    schema",[134,1052,823],{"class":144},[134,1054,1035],{"class":192},[134,1056,1057,1060,1062],{"class":136,"line":166},[134,1058,1059],{"class":808},"    loaded_at_field",[134,1061,823],{"class":144},[134,1063,1064],{"class":192},"_fivetran_synced\n",[134,1066,1067,1070,1072],{"class":136,"line":172},[134,1068,1069],{"class":808},"    loader",[134,1071,823],{"class":144},[134,1073,1074],{"class":192},"fivetran\n",[134,1076,1077,1079,1081],{"class":136,"line":180},[134,1078,831],{"class":808},[134,1080,823],{"class":144},[134,1082,1083],{"class":192},"Reddit Ads data\n",[134,1085,1086],{"class":136,"line":202},[134,1087,248],{"emptyLinePlaceholder":247},[134,1089,1090,1093],{"class":136,"line":213},[134,1091,1092],{"class":808},"    quoting",[134,1094,812],{"class":144},[134,1096,1097,1100,1102],{"class":136,"line":225},[134,1098,1099],{"class":808},"      database",[134,1101,823],{"class":144},[134,1103,1104],{"class":231},"true\n",[134,1106,1107,1110,1112],{"class":136,"line":244},[134,1108,1109],{"class":808},"      schema",[134,1111,823],{"class":144},[134,1113,1114],{"class":231},"false\n",[134,1116,1117,1120,1122],{"class":136,"line":251},[134,1118,1119],{"class":808},"      identifier",[134,1121,823],{"class":144},[134,1123,1114],{"class":231},[134,1125,1126],{"class":136,"line":265},[134,1127,248],{"emptyLinePlaceholder":247},[134,1129,1130,1133],{"class":136,"line":270},[134,1131,1132],{"class":808},"    tables",[134,1134,812],{"class":144},[134,1136,1137,1139,1141,1143],{"class":136,"line":727},[134,1138,848],{"class":144},[134,1140,820],{"class":808},[134,1142,823],{"class":144},[134,1144,1145],{"class":192},"time_zone\n",[12,1147,1148],{},[87,1149,95],{},[125,1151,1153],{"className":127,"code":1152,"language":129,"meta":130,"style":130},"WITH source AS (\n  SELECT *\n  FROM {{ ref('reddit_ads_time_zone_source') }}\n)\n\n\nSELECT * FROM source\n",[45,1154,1155,1165,1171,1183,1187,1191,1195],{"__ignoreMap":130},[134,1156,1157,1159,1161,1163],{"class":136,"line":137},[134,1158,548],{"class":140},[134,1160,551],{"class":144},[134,1162,554],{"class":140},[134,1164,557],{"class":144},[134,1166,1167,1169],{"class":136,"line":148},[134,1168,562],{"class":140},[134,1170,565],{"class":140},[134,1172,1173,1175,1178,1181],{"class":136,"line":154},[134,1174,570],{"class":140},[134,1176,1177],{"class":144}," {{ ref(",[134,1179,1180],{"class":192},"'reddit_ads_time_zone_source'",[134,1182,585],{"class":144},[134,1184,1185],{"class":136,"line":160},[134,1186,767],{"class":144},[134,1188,1189],{"class":136,"line":166},[134,1190,248],{"emptyLinePlaceholder":247},[134,1192,1193],{"class":136,"line":172},[134,1194,248],{"emptyLinePlaceholder":247},[134,1196,1197,1199,1201,1203],{"class":136,"line":180},[134,1198,141],{"class":140},[134,1200,785],{"class":140},[134,1202,788],{"class":140},[134,1204,761],{"class":144},[26,1206,1208],{"id":1207},"_5-品質検証","5. 品質検証",[12,1210,1211,1212,1217],{},"コードに問題がないことを確認し、MRにプッシュして",[19,1213,1216],{"href":1214,"rel":1215},"https://handbook.gitlab.com/handbook/enterprise-data/platform/ci-jobs/#build_changes",[],"CIテストパイプライン","を実行し、コードのテストと結果検証を行いました。GitLab Duoに検証クエリの作成を依頼しました：",[125,1219,1222],{"className":1220,"code":1221,"language":351,"meta":130},[349],"Create a test query to test the row counts between the raw layer and the workspace layer. Keep in mind that we do deduplication, so we can compare both using distinct on the primary keys.（rawレイヤーとworkspaceレイヤー間の行数をテストするクエリを作成してください。重複除去を実施しているため、主キーに対してdistinctを使用して比較できます。）\n",[45,1223,1221],{"__ignoreMap":130},[12,1225,1226],{},"AIが生成した包括的な検証クエリには、以下が含まれています：",[81,1228,1229,1232,1235,1238],{},[42,1230,1231],{},"rawレイヤーとワークスペースレイヤー間の行数を比較",[42,1233,1234],{},"重複除去ロジックに対応",[42,1236,1237],{},"全13テーブルをテスト",[42,1239,1240],{},"データ保持率を算出",[1242,1243,1244,1248],"details",{},[1245,1246,1247],"summary",{},"生成されたSQLテストクエリ",[125,1249,1251],{"className":127,"code":1250,"language":129,"meta":130,"style":130},"-- Reddit Ads Row Count Validation Test（Reddit Ads行数検証テスト）\n\n-- Compares distinct counts between RAW layer and WORKSPACE_MARKETING layer（RAWレイヤーとWORKSPACE_MARKETINGレイヤー間の一意カウントを比較）\n\n-- Accounts for deduplication logic in source models（ソースモデルの重複除去ロジックを考慮）\n\n\nWITH raw_counts AS (\n  -- Single primary key tables（単一主キーテーブル）\n  SELECT 'ad' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.AD\n  \n  UNION ALL\n  \n  SELECT 'business_account' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.BUSINESS_ACCOUNT\n  \n  UNION ALL\n  \n  SELECT 'campaign' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.CAMPAIGN\n  \n  UNION ALL\n  \n  SELECT 'custom_audience_history' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.CUSTOM_AUDIENCE_HISTORY\n  \n  UNION ALL\n  \n  SELECT 'geolocation' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.GEOLOCATION\n  \n  UNION ALL\n  \n  SELECT 'interest' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.INTEREST\n  \n  UNION ALL\n  \n  SELECT 'time_zone' AS table_name, COUNT(DISTINCT id) AS raw_count\n  FROM RAW.REDDIT_ADS.TIME_ZONE\n  \n  -- Composite primary key tables（複合主キーテーブル）\n  UNION ALL\n  \n  SELECT 'ad_group' AS table_name, COUNT(DISTINCT CONCAT(account_id, '|', id)) AS raw_count\n  FROM RAW.REDDIT_ADS.AD_GROUP\n  \n  UNION ALL\n  \n  SELECT 'targeting_community' AS table_name, COUNT(DISTINCT CONCAT(ad_group_id, '|', community_id)) AS raw_count\n  FROM RAW.REDDIT_ADS.TARGETING_COMMUNITY\n  \n  UNION ALL\n  \n  SELECT 'targeting_custom_audience' AS table_name, COUNT(DISTINCT CONCAT(ad_group_id, '|', custom_audience_id)) AS raw_count\n  FROM RAW.REDDIT_ADS.TARGETING_CUSTOM_AUDIENCE\n  \n  UNION ALL\n  \n  SELECT 'targeting_device' AS table_name, COUNT(DISTINCT _fivetran_id) AS raw_count\n  FROM RAW.REDDIT_ADS.TARGETING_DEVICE\n  \n  UNION ALL\n  \n  SELECT 'targeting_geolocation' AS table_name, COUNT(DISTINCT CONCAT(ad_group_id, '|', geolocation_id)) AS raw_count\n  FROM RAW.REDDIT_ADS.TARGETING_GEOLOCATION\n  \n  UNION ALL\n  \n  SELECT 'targeting_interest' AS table_name, COUNT(DISTINCT CONCAT(ad_group_id, '|', interest_id)) AS raw_count\n  FROM RAW.REDDIT_ADS.TARGETING_INTEREST\n),\n\n\nworkspace_counts AS (\n  -- Workspace layer counts using primary keys from schema.yml（schema.ymlの主キーを使用したワークスペースレイヤーカウント）\n  SELECT 'ad' AS table_name, COUNT(DISTINCT ad_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_AD\n  \n  UNION ALL\n  \n  SELECT 'business_account' AS table_name, COUNT(DISTINCT business_account_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_BUSINESS_ACCOUNT\n  \n  UNION ALL\n  \n  SELECT 'campaign' AS table_name, COUNT(DISTINCT campaign_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_CAMPAIGN\n  \n  UNION ALL\n  \n  SELECT 'custom_audience_history' AS table_name, COUNT(DISTINCT custom_audience_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_CUSTOM_AUDIENCE_HISTORY\n  \n  UNION ALL\n  \n  SELECT 'geolocation' AS table_name, COUNT(DISTINCT geolocation_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_GEOLOCATION\n  \n  UNION ALL\n  \n  SELECT 'interest' AS table_name, COUNT(DISTINCT interest_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_INTEREST\n  \n  UNION ALL\n  \n  SELECT 'time_zone' AS table_name, COUNT(DISTINCT time_zone_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_TIME_ZONE\n  \n  -- Composite primary key tables（複合主キーテーブル）\n  UNION ALL\n  \n  SELECT 'ad_group' AS table_name, COUNT(DISTINCT CONCAT(ad_group_account_id, '|', ad_group_id)) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_AD_GROUP\n  \n  UNION ALL\n  \n  SELECT 'targeting_community' AS table_name, COUNT(DISTINCT CONCAT(targeting_community_ad_group_id, '|', targeting_community_id)) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_TARGETING_COMMUNITY\n  \n  UNION ALL\n  \n  SELECT 'targeting_custom_audience' AS table_name, COUNT(DISTINCT CONCAT(targeting_custom_audience_ad_group_id, '|', targeting_custom_audience_id)) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_TARGETING_CUSTOM_AUDIENCE\n  \n  UNION ALL\n  \n  SELECT 'targeting_device' AS table_name, COUNT(DISTINCT targeting_device_fivetran_id) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_TARGETING_DEVICE\n  \n  UNION ALL\n  \n  SELECT 'targeting_geolocation' AS table_name, COUNT(DISTINCT CONCAT(targeting_geolocation_ad_group_id, '|', targeting_geolocation_id)) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_TARGETING_GEOLOCATION\n  \n  UNION ALL\n  \n  SELECT 'targeting_interest' AS table_name, COUNT(DISTINCT CONCAT(targeting_interest_ad_group_id, '|', targeting_interest_id)) AS workspace_count\n  FROM REDDIT_DBT_MODEL_GENERATION_PROD.WORKSPACE_MARKETING.WK_REDDIT_ADS_TARGETING_INTEREST\n)\n\n\n-- Final comparison with validation results（検証結果との最終比較）\n\nSELECT \n  r.table_name,\n  r.raw_count,\n  w.workspace_count,\n  r.raw_count - w.workspace_count AS count_difference,\n  CASE \n    WHEN r.raw_count = w.workspace_count THEN '✅ PASS（成功）'\n    WHEN r.raw_count > w.workspace_count THEN '⚠️ RAW > WORKSPACE (Expected due to deduplication 重複除去のため正常)'\n    ELSE '❌ FAIL（失敗） - WORKSPACE > RAW (Unexpected 異常)'\n  END AS validation_status,\n  ROUND((w.workspace_count::FLOAT / r.raw_count::FLOAT) * 100, 2) AS data_retention_percentage\nFROM raw_counts r\n\nJOIN workspace_counts w ON r.table_name = w.table_name\n\nORDER BY r.table_name;\n",[45,1252,1253,1259,1263,1268,1272,1277,1281,1285,1296,1301,1331,1346,1351,1356,1360,1383,1396,1400,1404,1408,1431,1444,1449,1454,1459,1483,1497,1502,1507,1512,1536,1550,1555,1560,1565,1589,1603,1608,1613,1618,1642,1656,1661,1667,1672,1677,1711,1725,1730,1735,1740,1772,1786,1791,1796,1801,1832,1846,1851,1856,1861,1886,1900,1905,1910,1915,1946,1960,1965,1970,1975,2006,2020,2025,2030,2035,2045,2051,2076,2092,2097,2102,2107,2131,2145,2150,2155,2160,2184,2198,2203,2208,2213,2237,2251,2256,2261,2266,2290,2304,2309,2314,2319,2343,2357,2362,2367,2372,2396,2410,2415,2420,2425,2430,2461,2475,2480,2485,2490,2521,2535,2540,2545,2550,2581,2595,2600,2605,2610,2634,2648,2653,2658,2663,2694,2708,2713,2718,2723,2754,2768,2773,2778,2783,2789,2794,2801,2815,2827,2840,2864,2872,2899,2924,2933,2944,2999,3007,3012,3039,3044],{"__ignoreMap":130},[134,1254,1255],{"class":136,"line":137},[134,1256,1258],{"class":1257},"sAwPA","-- Reddit Ads Row Count Validation Test（Reddit Ads行数検証テスト）\n",[134,1260,1261],{"class":136,"line":148},[134,1262,248],{"emptyLinePlaceholder":247},[134,1264,1265],{"class":136,"line":154},[134,1266,1267],{"class":1257},"-- Compares distinct counts between RAW layer and WORKSPACE_MARKETING layer（RAWレイヤーとWORKSPACE_MARKETINGレイヤー間の一意カウントを比較）\n",[134,1269,1270],{"class":136,"line":160},[134,1271,248],{"emptyLinePlaceholder":247},[134,1273,1274],{"class":136,"line":166},[134,1275,1276],{"class":1257},"-- Accounts for deduplication logic in source models（ソースモデルの重複除去ロジックを考慮）\n",[134,1278,1279],{"class":136,"line":172},[134,1280,248],{"emptyLinePlaceholder":247},[134,1282,1283],{"class":136,"line":180},[134,1284,248],{"emptyLinePlaceholder":247},[134,1286,1287,1289,1292,1294],{"class":136,"line":202},[134,1288,548],{"class":140},[134,1290,1291],{"class":144}," raw_counts ",[134,1293,554],{"class":140},[134,1295,557],{"class":144},[134,1297,1298],{"class":136,"line":213},[134,1299,1300],{"class":1257},"  -- Single primary key tables（単一主キーテーブル）\n",[134,1302,1303,1305,1308,1311,1314,1317,1320,1323,1326,1328],{"class":136,"line":225},[134,1304,562],{"class":140},[134,1306,1307],{"class":192}," 'ad'",[134,1309,1310],{"class":140}," AS",[134,1312,1313],{"class":144}," table_name, ",[134,1315,1316],{"class":231},"COUNT",[134,1318,1319],{"class":144},"(",[134,1321,1322],{"class":140},"DISTINCT",[134,1324,1325],{"class":144}," id) ",[134,1327,554],{"class":140},[134,1329,1330],{"class":144}," raw_count\n",[134,1332,1333,1335,1338,1340,1343],{"class":136,"line":244},[134,1334,570],{"class":140},[134,1336,1337],{"class":231}," RAW",[134,1339,235],{"class":144},[134,1341,1342],{"class":231},"REDDIT_ADS",[134,1344,1345],{"class":144},".AD\n",[134,1347,1348],{"class":136,"line":251},[134,1349,1350],{"class":144},"  \n",[134,1352,1353],{"class":136,"line":265},[134,1354,1355],{"class":140},"  UNION ALL\n",[134,1357,1358],{"class":136,"line":270},[134,1359,1350],{"class":144},[134,1361,1362,1364,1367,1369,1371,1373,1375,1377,1379,1381],{"class":136,"line":727},[134,1363,562],{"class":140},[134,1365,1366],{"class":192}," 'business_account'",[134,1368,1310],{"class":140},[134,1370,1313],{"class":144},[134,1372,1316],{"class":231},[134,1374,1319],{"class":144},[134,1376,1322],{"class":140},[134,1378,1325],{"class":144},[134,1380,554],{"class":140},[134,1382,1330],{"class":144},[134,1384,1385,1387,1389,1391,1393],{"class":136,"line":741},[134,1386,570],{"class":140},[134,1388,1337],{"class":231},[134,1390,235],{"class":144},[134,1392,1342],{"class":231},[134,1394,1395],{"class":144},".BUSINESS_ACCOUNT\n",[134,1397,1398],{"class":136,"line":756},[134,1399,1350],{"class":144},[134,1401,1402],{"class":136,"line":764},[134,1403,1355],{"class":140},[134,1405,1406],{"class":136,"line":770},[134,1407,1350],{"class":144},[134,1409,1410,1412,1415,1417,1419,1421,1423,1425,1427,1429],{"class":136,"line":775},[134,1411,562],{"class":140},[134,1413,1414],{"class":192}," 'campaign'",[134,1416,1310],{"class":140},[134,1418,1313],{"class":144},[134,1420,1316],{"class":231},[134,1422,1319],{"class":144},[134,1424,1322],{"class":140},[134,1426,1325],{"class":144},[134,1428,554],{"class":140},[134,1430,1330],{"class":144},[134,1432,1433,1435,1437,1439,1441],{"class":136,"line":780},[134,1434,570],{"class":140},[134,1436,1337],{"class":231},[134,1438,235],{"class":144},[134,1440,1342],{"class":231},[134,1442,1443],{"class":144},".CAMPAIGN\n",[134,1445,1447],{"class":136,"line":1446},22,[134,1448,1350],{"class":144},[134,1450,1452],{"class":136,"line":1451},23,[134,1453,1355],{"class":140},[134,1455,1457],{"class":136,"line":1456},24,[134,1458,1350],{"class":144},[134,1460,1462,1464,1467,1469,1471,1473,1475,1477,1479,1481],{"class":136,"line":1461},25,[134,1463,562],{"class":140},[134,1465,1466],{"class":192}," 'custom_audience_history'",[134,1468,1310],{"class":140},[134,1470,1313],{"class":144},[134,1472,1316],{"class":231},[134,1474,1319],{"class":144},[134,1476,1322],{"class":140},[134,1478,1325],{"class":144},[134,1480,554],{"class":140},[134,1482,1330],{"class":144},[134,1484,1486,1488,1490,1492,1494],{"class":136,"line":1485},26,[134,1487,570],{"class":140},[134,1489,1337],{"class":231},[134,1491,235],{"class":144},[134,1493,1342],{"class":231},[134,1495,1496],{"class":144},".CUSTOM_AUDIENCE_HISTORY\n",[134,1498,1500],{"class":136,"line":1499},27,[134,1501,1350],{"class":144},[134,1503,1505],{"class":136,"line":1504},28,[134,1506,1355],{"class":140},[134,1508,1510],{"class":136,"line":1509},29,[134,1511,1350],{"class":144},[134,1513,1515,1517,1520,1522,1524,1526,1528,1530,1532,1534],{"class":136,"line":1514},30,[134,1516,562],{"class":140},[134,1518,1519],{"class":192}," 'geolocation'",[134,1521,1310],{"class":140},[134,1523,1313],{"class":144},[134,1525,1316],{"class":231},[134,1527,1319],{"class":144},[134,1529,1322],{"class":140},[134,1531,1325],{"class":144},[134,1533,554],{"class":140},[134,1535,1330],{"class":144},[134,1537,1539,1541,1543,1545,1547],{"class":136,"line":1538},31,[134,1540,570],{"class":140},[134,1542,1337],{"class":231},[134,1544,235],{"class":144},[134,1546,1342],{"class":231},[134,1548,1549],{"class":144},".GEOLOCATION\n",[134,1551,1553],{"class":136,"line":1552},32,[134,1554,1350],{"class":144},[134,1556,1558],{"class":136,"line":1557},33,[134,1559,1355],{"class":140},[134,1561,1563],{"class":136,"line":1562},34,[134,1564,1350],{"class":144},[134,1566,1568,1570,1573,1575,1577,1579,1581,1583,1585,1587],{"class":136,"line":1567},35,[134,1569,562],{"class":140},[134,1571,1572],{"class":192}," 'interest'",[134,1574,1310],{"class":140},[134,1576,1313],{"class":144},[134,1578,1316],{"class":231},[134,1580,1319],{"class":144},[134,1582,1322],{"class":140},[134,1584,1325],{"class":144},[134,1586,554],{"class":140},[134,1588,1330],{"class":144},[134,1590,1592,1594,1596,1598,1600],{"class":136,"line":1591},36,[134,1593,570],{"class":140},[134,1595,1337],{"class":231},[134,1597,235],{"class":144},[134,1599,1342],{"class":231},[134,1601,1602],{"class":144},".INTEREST\n",[134,1604,1606],{"class":136,"line":1605},37,[134,1607,1350],{"class":144},[134,1609,1611],{"class":136,"line":1610},38,[134,1612,1355],{"class":140},[134,1614,1616],{"class":136,"line":1615},39,[134,1617,1350],{"class":144},[134,1619,1621,1623,1626,1628,1630,1632,1634,1636,1638,1640],{"class":136,"line":1620},40,[134,1622,562],{"class":140},[134,1624,1625],{"class":192}," 'time_zone'",[134,1627,1310],{"class":140},[134,1629,1313],{"class":144},[134,1631,1316],{"class":231},[134,1633,1319],{"class":144},[134,1635,1322],{"class":140},[134,1637,1325],{"class":144},[134,1639,554],{"class":140},[134,1641,1330],{"class":144},[134,1643,1645,1647,1649,1651,1653],{"class":136,"line":1644},41,[134,1646,570],{"class":140},[134,1648,1337],{"class":231},[134,1650,235],{"class":144},[134,1652,1342],{"class":231},[134,1654,1655],{"class":144},".TIME_ZONE\n",[134,1657,1659],{"class":136,"line":1658},42,[134,1660,1350],{"class":144},[134,1662,1664],{"class":136,"line":1663},43,[134,1665,1666],{"class":1257},"  -- Composite primary key tables（複合主キーテーブル）\n",[134,1668,1670],{"class":136,"line":1669},44,[134,1671,1355],{"class":140},[134,1673,1675],{"class":136,"line":1674},45,[134,1676,1350],{"class":144},[134,1678,1680,1682,1685,1687,1689,1691,1693,1695,1698,1701,1704,1707,1709],{"class":136,"line":1679},46,[134,1681,562],{"class":140},[134,1683,1684],{"class":192}," 'ad_group'",[134,1686,1310],{"class":140},[134,1688,1313],{"class":144},[134,1690,1316],{"class":231},[134,1692,1319],{"class":144},[134,1694,1322],{"class":140},[134,1696,1697],{"class":231}," CONCAT",[134,1699,1700],{"class":144},"(account_id, ",[134,1702,1703],{"class":192},"'|'",[134,1705,1706],{"class":144},", id)) ",[134,1708,554],{"class":140},[134,1710,1330],{"class":144},[134,1712,1714,1716,1718,1720,1722],{"class":136,"line":1713},47,[134,1715,570],{"class":140},[134,1717,1337],{"class":231},[134,1719,235],{"class":144},[134,1721,1342],{"class":231},[134,1723,1724],{"class":144},".AD_GROUP\n",[134,1726,1728],{"class":136,"line":1727},48,[134,1729,1350],{"class":144},[134,1731,1733],{"class":136,"line":1732},49,[134,1734,1355],{"class":140},[134,1736,1738],{"class":136,"line":1737},50,[134,1739,1350],{"class":144},[134,1741,1743,1745,1748,1750,1752,1754,1756,1758,1760,1763,1765,1768,1770],{"class":136,"line":1742},51,[134,1744,562],{"class":140},[134,1746,1747],{"class":192}," 'targeting_community'",[134,1749,1310],{"class":140},[134,1751,1313],{"class":144},[134,1753,1316],{"class":231},[134,1755,1319],{"class":144},[134,1757,1322],{"class":140},[134,1759,1697],{"class":231},[134,1761,1762],{"class":144},"(ad_group_id, ",[134,1764,1703],{"class":192},[134,1766,1767],{"class":144},", community_id)) ",[134,1769,554],{"class":140},[134,1771,1330],{"class":144},[134,1773,1775,1777,1779,1781,1783],{"class":136,"line":1774},52,[134,1776,570],{"class":140},[134,1778,1337],{"class":231},[134,1780,235],{"class":144},[134,1782,1342],{"class":231},[134,1784,1785],{"class":144},".TARGETING_COMMUNITY\n",[134,1787,1789],{"class":136,"line":1788},53,[134,1790,1350],{"class":144},[134,1792,1794],{"class":136,"line":1793},54,[134,1795,1355],{"class":140},[134,1797,1799],{"class":136,"line":1798},55,[134,1800,1350],{"class":144},[134,1802,1804,1806,1809,1811,1813,1815,1817,1819,1821,1823,1825,1828,1830],{"class":136,"line":1803},56,[134,1805,562],{"class":140},[134,1807,1808],{"class":192}," 'targeting_custom_audience'",[134,1810,1310],{"class":140},[134,1812,1313],{"class":144},[134,1814,1316],{"class":231},[134,1816,1319],{"class":144},[134,1818,1322],{"class":140},[134,1820,1697],{"class":231},[134,1822,1762],{"class":144},[134,1824,1703],{"class":192},[134,1826,1827],{"class":144},", custom_audience_id)) ",[134,1829,554],{"class":140},[134,1831,1330],{"class":144},[134,1833,1835,1837,1839,1841,1843],{"class":136,"line":1834},57,[134,1836,570],{"class":140},[134,1838,1337],{"class":231},[134,1840,235],{"class":144},[134,1842,1342],{"class":231},[134,1844,1845],{"class":144},".TARGETING_CUSTOM_AUDIENCE\n",[134,1847,1849],{"class":136,"line":1848},58,[134,1850,1350],{"class":144},[134,1852,1854],{"class":136,"line":1853},59,[134,1855,1355],{"class":140},[134,1857,1859],{"class":136,"line":1858},60,[134,1860,1350],{"class":144},[134,1862,1864,1866,1869,1871,1873,1875,1877,1879,1882,1884],{"class":136,"line":1863},61,[134,1865,562],{"class":140},[134,1867,1868],{"class":192}," 'targeting_device'",[134,1870,1310],{"class":140},[134,1872,1313],{"class":144},[134,1874,1316],{"class":231},[134,1876,1319],{"class":144},[134,1878,1322],{"class":140},[134,1880,1881],{"class":144}," _fivetran_id) ",[134,1883,554],{"class":140},[134,1885,1330],{"class":144},[134,1887,1889,1891,1893,1895,1897],{"class":136,"line":1888},62,[134,1890,570],{"class":140},[134,1892,1337],{"class":231},[134,1894,235],{"class":144},[134,1896,1342],{"class":231},[134,1898,1899],{"class":144},".TARGETING_DEVICE\n",[134,1901,1903],{"class":136,"line":1902},63,[134,1904,1350],{"class":144},[134,1906,1908],{"class":136,"line":1907},64,[134,1909,1355],{"class":140},[134,1911,1913],{"class":136,"line":1912},65,[134,1914,1350],{"class":144},[134,1916,1918,1920,1923,1925,1927,1929,1931,1933,1935,1937,1939,1942,1944],{"class":136,"line":1917},66,[134,1919,562],{"class":140},[134,1921,1922],{"class":192}," 'targeting_geolocation'",[134,1924,1310],{"class":140},[134,1926,1313],{"class":144},[134,1928,1316],{"class":231},[134,1930,1319],{"class":144},[134,1932,1322],{"class":140},[134,1934,1697],{"class":231},[134,1936,1762],{"class":144},[134,1938,1703],{"class":192},[134,1940,1941],{"class":144},", geolocation_id)) ",[134,1943,554],{"class":140},[134,1945,1330],{"class":144},[134,1947,1949,1951,1953,1955,1957],{"class":136,"line":1948},67,[134,1950,570],{"class":140},[134,1952,1337],{"class":231},[134,1954,235],{"class":144},[134,1956,1342],{"class":231},[134,1958,1959],{"class":144},".TARGETING_GEOLOCATION\n",[134,1961,1963],{"class":136,"line":1962},68,[134,1964,1350],{"class":144},[134,1966,1968],{"class":136,"line":1967},69,[134,1969,1355],{"class":140},[134,1971,1973],{"class":136,"line":1972},70,[134,1974,1350],{"class":144},[134,1976,1978,1980,1983,1985,1987,1989,1991,1993,1995,1997,1999,2002,2004],{"class":136,"line":1977},71,[134,1979,562],{"class":140},[134,1981,1982],{"class":192}," 'targeting_interest'",[134,1984,1310],{"class":140},[134,1986,1313],{"class":144},[134,1988,1316],{"class":231},[134,1990,1319],{"class":144},[134,1992,1322],{"class":140},[134,1994,1697],{"class":231},[134,1996,1762],{"class":144},[134,1998,1703],{"class":192},[134,2000,2001],{"class":144},", interest_id)) ",[134,2003,554],{"class":140},[134,2005,1330],{"class":144},[134,2007,2009,2011,2013,2015,2017],{"class":136,"line":2008},72,[134,2010,570],{"class":140},[134,2012,1337],{"class":231},[134,2014,235],{"class":144},[134,2016,1342],{"class":231},[134,2018,2019],{"class":144},".TARGETING_INTEREST\n",[134,2021,2023],{"class":136,"line":2022},73,[134,2024,632],{"class":144},[134,2026,2028],{"class":136,"line":2027},74,[134,2029,248],{"emptyLinePlaceholder":247},[134,2031,2033],{"class":136,"line":2032},75,[134,2034,248],{"emptyLinePlaceholder":247},[134,2036,2038,2041,2043],{"class":136,"line":2037},76,[134,2039,2040],{"class":144},"workspace_counts ",[134,2042,554],{"class":140},[134,2044,557],{"class":144},[134,2046,2048],{"class":136,"line":2047},77,[134,2049,2050],{"class":1257},"  -- Workspace layer counts using primary keys from schema.yml（schema.ymlの主キーを使用したワークスペースレイヤーカウント）\n",[134,2052,2054,2056,2058,2060,2062,2064,2066,2068,2071,2073],{"class":136,"line":2053},78,[134,2055,562],{"class":140},[134,2057,1307],{"class":192},[134,2059,1310],{"class":140},[134,2061,1313],{"class":144},[134,2063,1316],{"class":231},[134,2065,1319],{"class":144},[134,2067,1322],{"class":140},[134,2069,2070],{"class":144}," ad_id) ",[134,2072,554],{"class":140},[134,2074,2075],{"class":144}," workspace_count\n",[134,2077,2079,2081,2084,2086,2089],{"class":136,"line":2078},79,[134,2080,570],{"class":140},[134,2082,2083],{"class":231}," REDDIT_DBT_MODEL_GENERATION_PROD",[134,2085,235],{"class":144},[134,2087,2088],{"class":231},"WORKSPACE_MARKETING",[134,2090,2091],{"class":144},".WK_REDDIT_ADS_AD\n",[134,2093,2095],{"class":136,"line":2094},80,[134,2096,1350],{"class":144},[134,2098,2100],{"class":136,"line":2099},81,[134,2101,1355],{"class":140},[134,2103,2105],{"class":136,"line":2104},82,[134,2106,1350],{"class":144},[134,2108,2110,2112,2114,2116,2118,2120,2122,2124,2127,2129],{"class":136,"line":2109},83,[134,2111,562],{"class":140},[134,2113,1366],{"class":192},[134,2115,1310],{"class":140},[134,2117,1313],{"class":144},[134,2119,1316],{"class":231},[134,2121,1319],{"class":144},[134,2123,1322],{"class":140},[134,2125,2126],{"class":144}," business_account_id) ",[134,2128,554],{"class":140},[134,2130,2075],{"class":144},[134,2132,2134,2136,2138,2140,2142],{"class":136,"line":2133},84,[134,2135,570],{"class":140},[134,2137,2083],{"class":231},[134,2139,235],{"class":144},[134,2141,2088],{"class":231},[134,2143,2144],{"class":144},".WK_REDDIT_ADS_BUSINESS_ACCOUNT\n",[134,2146,2148],{"class":136,"line":2147},85,[134,2149,1350],{"class":144},[134,2151,2153],{"class":136,"line":2152},86,[134,2154,1355],{"class":140},[134,2156,2158],{"class":136,"line":2157},87,[134,2159,1350],{"class":144},[134,2161,2163,2165,2167,2169,2171,2173,2175,2177,2180,2182],{"class":136,"line":2162},88,[134,2164,562],{"class":140},[134,2166,1414],{"class":192},[134,2168,1310],{"class":140},[134,2170,1313],{"class":144},[134,2172,1316],{"class":231},[134,2174,1319],{"class":144},[134,2176,1322],{"class":140},[134,2178,2179],{"class":144}," campaign_id) ",[134,2181,554],{"class":140},[134,2183,2075],{"class":144},[134,2185,2187,2189,2191,2193,2195],{"class":136,"line":2186},89,[134,2188,570],{"class":140},[134,2190,2083],{"class":231},[134,2192,235],{"class":144},[134,2194,2088],{"class":231},[134,2196,2197],{"class":144},".WK_REDDIT_ADS_CAMPAIGN\n",[134,2199,2201],{"class":136,"line":2200},90,[134,2202,1350],{"class":144},[134,2204,2206],{"class":136,"line":2205},91,[134,2207,1355],{"class":140},[134,2209,2211],{"class":136,"line":2210},92,[134,2212,1350],{"class":144},[134,2214,2216,2218,2220,2222,2224,2226,2228,2230,2233,2235],{"class":136,"line":2215},93,[134,2217,562],{"class":140},[134,2219,1466],{"class":192},[134,2221,1310],{"class":140},[134,2223,1313],{"class":144},[134,2225,1316],{"class":231},[134,2227,1319],{"class":144},[134,2229,1322],{"class":140},[134,2231,2232],{"class":144}," custom_audience_id) ",[134,2234,554],{"class":140},[134,2236,2075],{"class":144},[134,2238,2240,2242,2244,2246,2248],{"class":136,"line":2239},94,[134,2241,570],{"class":140},[134,2243,2083],{"class":231},[134,2245,235],{"class":144},[134,2247,2088],{"class":231},[134,2249,2250],{"class":144},".WK_REDDIT_ADS_CUSTOM_AUDIENCE_HISTORY\n",[134,2252,2254],{"class":136,"line":2253},95,[134,2255,1350],{"class":144},[134,2257,2259],{"class":136,"line":2258},96,[134,2260,1355],{"class":140},[134,2262,2264],{"class":136,"line":2263},97,[134,2265,1350],{"class":144},[134,2267,2269,2271,2273,2275,2277,2279,2281,2283,2286,2288],{"class":136,"line":2268},98,[134,2270,562],{"class":140},[134,2272,1519],{"class":192},[134,2274,1310],{"class":140},[134,2276,1313],{"class":144},[134,2278,1316],{"class":231},[134,2280,1319],{"class":144},[134,2282,1322],{"class":140},[134,2284,2285],{"class":144}," geolocation_id) ",[134,2287,554],{"class":140},[134,2289,2075],{"class":144},[134,2291,2293,2295,2297,2299,2301],{"class":136,"line":2292},99,[134,2294,570],{"class":140},[134,2296,2083],{"class":231},[134,2298,235],{"class":144},[134,2300,2088],{"class":231},[134,2302,2303],{"class":144},".WK_REDDIT_ADS_GEOLOCATION\n",[134,2305,2307],{"class":136,"line":2306},100,[134,2308,1350],{"class":144},[134,2310,2312],{"class":136,"line":2311},101,[134,2313,1355],{"class":140},[134,2315,2317],{"class":136,"line":2316},102,[134,2318,1350],{"class":144},[134,2320,2322,2324,2326,2328,2330,2332,2334,2336,2339,2341],{"class":136,"line":2321},103,[134,2323,562],{"class":140},[134,2325,1572],{"class":192},[134,2327,1310],{"class":140},[134,2329,1313],{"class":144},[134,2331,1316],{"class":231},[134,2333,1319],{"class":144},[134,2335,1322],{"class":140},[134,2337,2338],{"class":144}," interest_id) ",[134,2340,554],{"class":140},[134,2342,2075],{"class":144},[134,2344,2346,2348,2350,2352,2354],{"class":136,"line":2345},104,[134,2347,570],{"class":140},[134,2349,2083],{"class":231},[134,2351,235],{"class":144},[134,2353,2088],{"class":231},[134,2355,2356],{"class":144},".WK_REDDIT_ADS_INTEREST\n",[134,2358,2360],{"class":136,"line":2359},105,[134,2361,1350],{"class":144},[134,2363,2365],{"class":136,"line":2364},106,[134,2366,1355],{"class":140},[134,2368,2370],{"class":136,"line":2369},107,[134,2371,1350],{"class":144},[134,2373,2375,2377,2379,2381,2383,2385,2387,2389,2392,2394],{"class":136,"line":2374},108,[134,2376,562],{"class":140},[134,2378,1625],{"class":192},[134,2380,1310],{"class":140},[134,2382,1313],{"class":144},[134,2384,1316],{"class":231},[134,2386,1319],{"class":144},[134,2388,1322],{"class":140},[134,2390,2391],{"class":144}," time_zone_id) ",[134,2393,554],{"class":140},[134,2395,2075],{"class":144},[134,2397,2399,2401,2403,2405,2407],{"class":136,"line":2398},109,[134,2400,570],{"class":140},[134,2402,2083],{"class":231},[134,2404,235],{"class":144},[134,2406,2088],{"class":231},[134,2408,2409],{"class":144},".WK_REDDIT_ADS_TIME_ZONE\n",[134,2411,2413],{"class":136,"line":2412},110,[134,2414,1350],{"class":144},[134,2416,2418],{"class":136,"line":2417},111,[134,2419,1666],{"class":1257},[134,2421,2423],{"class":136,"line":2422},112,[134,2424,1355],{"class":140},[134,2426,2428],{"class":136,"line":2427},113,[134,2429,1350],{"class":144},[134,2431,2433,2435,2437,2439,2441,2443,2445,2447,2449,2452,2454,2457,2459],{"class":136,"line":2432},114,[134,2434,562],{"class":140},[134,2436,1684],{"class":192},[134,2438,1310],{"class":140},[134,2440,1313],{"class":144},[134,2442,1316],{"class":231},[134,2444,1319],{"class":144},[134,2446,1322],{"class":140},[134,2448,1697],{"class":231},[134,2450,2451],{"class":144},"(ad_group_account_id, ",[134,2453,1703],{"class":192},[134,2455,2456],{"class":144},", ad_group_id)) ",[134,2458,554],{"class":140},[134,2460,2075],{"class":144},[134,2462,2464,2466,2468,2470,2472],{"class":136,"line":2463},115,[134,2465,570],{"class":140},[134,2467,2083],{"class":231},[134,2469,235],{"class":144},[134,2471,2088],{"class":231},[134,2473,2474],{"class":144},".WK_REDDIT_ADS_AD_GROUP\n",[134,2476,2478],{"class":136,"line":2477},116,[134,2479,1350],{"class":144},[134,2481,2483],{"class":136,"line":2482},117,[134,2484,1355],{"class":140},[134,2486,2488],{"class":136,"line":2487},118,[134,2489,1350],{"class":144},[134,2491,2493,2495,2497,2499,2501,2503,2505,2507,2509,2512,2514,2517,2519],{"class":136,"line":2492},119,[134,2494,562],{"class":140},[134,2496,1747],{"class":192},[134,2498,1310],{"class":140},[134,2500,1313],{"class":144},[134,2502,1316],{"class":231},[134,2504,1319],{"class":144},[134,2506,1322],{"class":140},[134,2508,1697],{"class":231},[134,2510,2511],{"class":144},"(targeting_community_ad_group_id, ",[134,2513,1703],{"class":192},[134,2515,2516],{"class":144},", targeting_community_id)) ",[134,2518,554],{"class":140},[134,2520,2075],{"class":144},[134,2522,2524,2526,2528,2530,2532],{"class":136,"line":2523},120,[134,2525,570],{"class":140},[134,2527,2083],{"class":231},[134,2529,235],{"class":144},[134,2531,2088],{"class":231},[134,2533,2534],{"class":144},".WK_REDDIT_ADS_TARGETING_COMMUNITY\n",[134,2536,2538],{"class":136,"line":2537},121,[134,2539,1350],{"class":144},[134,2541,2543],{"class":136,"line":2542},122,[134,2544,1355],{"class":140},[134,2546,2548],{"class":136,"line":2547},123,[134,2549,1350],{"class":144},[134,2551,2553,2555,2557,2559,2561,2563,2565,2567,2569,2572,2574,2577,2579],{"class":136,"line":2552},124,[134,2554,562],{"class":140},[134,2556,1808],{"class":192},[134,2558,1310],{"class":140},[134,2560,1313],{"class":144},[134,2562,1316],{"class":231},[134,2564,1319],{"class":144},[134,2566,1322],{"class":140},[134,2568,1697],{"class":231},[134,2570,2571],{"class":144},"(targeting_custom_audience_ad_group_id, ",[134,2573,1703],{"class":192},[134,2575,2576],{"class":144},", targeting_custom_audience_id)) ",[134,2578,554],{"class":140},[134,2580,2075],{"class":144},[134,2582,2584,2586,2588,2590,2592],{"class":136,"line":2583},125,[134,2585,570],{"class":140},[134,2587,2083],{"class":231},[134,2589,235],{"class":144},[134,2591,2088],{"class":231},[134,2593,2594],{"class":144},".WK_REDDIT_ADS_TARGETING_CUSTOM_AUDIENCE\n",[134,2596,2598],{"class":136,"line":2597},126,[134,2599,1350],{"class":144},[134,2601,2603],{"class":136,"line":2602},127,[134,2604,1355],{"class":140},[134,2606,2608],{"class":136,"line":2607},128,[134,2609,1350],{"class":144},[134,2611,2613,2615,2617,2619,2621,2623,2625,2627,2630,2632],{"class":136,"line":2612},129,[134,2614,562],{"class":140},[134,2616,1868],{"class":192},[134,2618,1310],{"class":140},[134,2620,1313],{"class":144},[134,2622,1316],{"class":231},[134,2624,1319],{"class":144},[134,2626,1322],{"class":140},[134,2628,2629],{"class":144}," targeting_device_fivetran_id) ",[134,2631,554],{"class":140},[134,2633,2075],{"class":144},[134,2635,2637,2639,2641,2643,2645],{"class":136,"line":2636},130,[134,2638,570],{"class":140},[134,2640,2083],{"class":231},[134,2642,235],{"class":144},[134,2644,2088],{"class":231},[134,2646,2647],{"class":144},".WK_REDDIT_ADS_TARGETING_DEVICE\n",[134,2649,2651],{"class":136,"line":2650},131,[134,2652,1350],{"class":144},[134,2654,2656],{"class":136,"line":2655},132,[134,2657,1355],{"class":140},[134,2659,2661],{"class":136,"line":2660},133,[134,2662,1350],{"class":144},[134,2664,2666,2668,2670,2672,2674,2676,2678,2680,2682,2685,2687,2690,2692],{"class":136,"line":2665},134,[134,2667,562],{"class":140},[134,2669,1922],{"class":192},[134,2671,1310],{"class":140},[134,2673,1313],{"class":144},[134,2675,1316],{"class":231},[134,2677,1319],{"class":144},[134,2679,1322],{"class":140},[134,2681,1697],{"class":231},[134,2683,2684],{"class":144},"(targeting_geolocation_ad_group_id, ",[134,2686,1703],{"class":192},[134,2688,2689],{"class":144},", targeting_geolocation_id)) ",[134,2691,554],{"class":140},[134,2693,2075],{"class":144},[134,2695,2697,2699,2701,2703,2705],{"class":136,"line":2696},135,[134,2698,570],{"class":140},[134,2700,2083],{"class":231},[134,2702,235],{"class":144},[134,2704,2088],{"class":231},[134,2706,2707],{"class":144},".WK_REDDIT_ADS_TARGETING_GEOLOCATION\n",[134,2709,2711],{"class":136,"line":2710},136,[134,2712,1350],{"class":144},[134,2714,2716],{"class":136,"line":2715},137,[134,2717,1355],{"class":140},[134,2719,2721],{"class":136,"line":2720},138,[134,2722,1350],{"class":144},[134,2724,2726,2728,2730,2732,2734,2736,2738,2740,2742,2745,2747,2750,2752],{"class":136,"line":2725},139,[134,2727,562],{"class":140},[134,2729,1982],{"class":192},[134,2731,1310],{"class":140},[134,2733,1313],{"class":144},[134,2735,1316],{"class":231},[134,2737,1319],{"class":144},[134,2739,1322],{"class":140},[134,2741,1697],{"class":231},[134,2743,2744],{"class":144},"(targeting_interest_ad_group_id, ",[134,2746,1703],{"class":192},[134,2748,2749],{"class":144},", targeting_interest_id)) ",[134,2751,554],{"class":140},[134,2753,2075],{"class":144},[134,2755,2757,2759,2761,2763,2765],{"class":136,"line":2756},140,[134,2758,570],{"class":140},[134,2760,2083],{"class":231},[134,2762,235],{"class":144},[134,2764,2088],{"class":231},[134,2766,2767],{"class":144},".WK_REDDIT_ADS_TARGETING_INTEREST\n",[134,2769,2771],{"class":136,"line":2770},141,[134,2772,767],{"class":144},[134,2774,2776],{"class":136,"line":2775},142,[134,2777,248],{"emptyLinePlaceholder":247},[134,2779,2781],{"class":136,"line":2780},143,[134,2782,248],{"emptyLinePlaceholder":247},[134,2784,2786],{"class":136,"line":2785},144,[134,2787,2788],{"class":1257},"-- Final comparison with validation results（検証結果との最終比較）\n",[134,2790,2792],{"class":136,"line":2791},145,[134,2793,248],{"emptyLinePlaceholder":247},[134,2795,2797,2799],{"class":136,"line":2796},146,[134,2798,141],{"class":140},[134,2800,145],{"class":144},[134,2802,2804,2807,2809,2812],{"class":136,"line":2803},147,[134,2805,2806],{"class":231},"  r",[134,2808,235],{"class":144},[134,2810,2811],{"class":231},"table_name",[134,2813,2814],{"class":144},",\n",[134,2816,2818,2820,2822,2825],{"class":136,"line":2817},148,[134,2819,2806],{"class":231},[134,2821,235],{"class":144},[134,2823,2824],{"class":231},"raw_count",[134,2826,2814],{"class":144},[134,2828,2830,2833,2835,2838],{"class":136,"line":2829},149,[134,2831,2832],{"class":231},"  w",[134,2834,235],{"class":144},[134,2836,2837],{"class":231},"workspace_count",[134,2839,2814],{"class":144},[134,2841,2843,2845,2847,2849,2852,2855,2857,2859,2861],{"class":136,"line":2842},150,[134,2844,2806],{"class":231},[134,2846,235],{"class":144},[134,2848,2824],{"class":231},[134,2850,2851],{"class":140}," -",[134,2853,2854],{"class":231}," w",[134,2856,235],{"class":144},[134,2858,2837],{"class":231},[134,2860,1310],{"class":140},[134,2862,2863],{"class":144}," count_difference,\n",[134,2865,2867,2870],{"class":136,"line":2866},151,[134,2868,2869],{"class":140},"  CASE",[134,2871,145],{"class":144},[134,2873,2875,2878,2881,2883,2885,2888,2890,2892,2894,2896],{"class":136,"line":2874},152,[134,2876,2877],{"class":140},"    WHEN",[134,2879,2880],{"class":231}," r",[134,2882,235],{"class":144},[134,2884,2824],{"class":231},[134,2886,2887],{"class":140}," =",[134,2889,2854],{"class":231},[134,2891,235],{"class":144},[134,2893,2837],{"class":231},[134,2895,196],{"class":140},[134,2897,2898],{"class":192}," '✅ PASS（成功）'\n",[134,2900,2902,2904,2906,2908,2910,2913,2915,2917,2919,2921],{"class":136,"line":2901},153,[134,2903,2877],{"class":140},[134,2905,2880],{"class":231},[134,2907,235],{"class":144},[134,2909,2824],{"class":231},[134,2911,2912],{"class":140}," >",[134,2914,2854],{"class":231},[134,2916,235],{"class":144},[134,2918,2837],{"class":231},[134,2920,196],{"class":140},[134,2922,2923],{"class":192}," '⚠️ RAW > WORKSPACE (Expected due to deduplication 重複除去のため正常)'\n",[134,2925,2927,2930],{"class":136,"line":2926},154,[134,2928,2929],{"class":140},"    ELSE",[134,2931,2932],{"class":192}," '❌ FAIL（失敗） - WORKSPACE > RAW (Unexpected 異常)'\n",[134,2934,2936,2939,2941],{"class":136,"line":2935},155,[134,2937,2938],{"class":140},"  END",[134,2940,1310],{"class":140},[134,2942,2943],{"class":144}," validation_status,\n",[134,2945,2947,2950,2953,2956,2958,2960,2962,2965,2968,2970,2972,2974,2976,2978,2980,2983,2986,2989,2992,2994,2996],{"class":136,"line":2946},156,[134,2948,2949],{"class":231},"  ROUND",[134,2951,2952],{"class":144},"((",[134,2954,2955],{"class":231},"w",[134,2957,235],{"class":144},[134,2959,2837],{"class":231},[134,2961,717],{"class":144},[134,2963,2964],{"class":140},"FLOAT",[134,2966,2967],{"class":140}," /",[134,2969,2880],{"class":231},[134,2971,235],{"class":144},[134,2973,2824],{"class":231},[134,2975,717],{"class":144},[134,2977,2964],{"class":140},[134,2979,622],{"class":144},[134,2981,2982],{"class":140},"*",[134,2984,2985],{"class":231}," 100",[134,2987,2988],{"class":144},", ",[134,2990,2991],{"class":231},"2",[134,2993,622],{"class":144},[134,2995,554],{"class":140},[134,2997,2998],{"class":144}," data_retention_percentage\n",[134,3000,3002,3004],{"class":136,"line":3001},157,[134,3003,228],{"class":140},[134,3005,3006],{"class":144}," raw_counts r\n",[134,3008,3010],{"class":136,"line":3009},158,[134,3011,248],{"emptyLinePlaceholder":247},[134,3013,3015,3018,3021,3024,3026,3028,3030,3032,3034,3036],{"class":136,"line":3014},159,[134,3016,3017],{"class":140},"JOIN",[134,3019,3020],{"class":144}," workspace_counts w ",[134,3022,3023],{"class":140},"ON",[134,3025,2880],{"class":231},[134,3027,235],{"class":144},[134,3029,2811],{"class":231},[134,3031,2887],{"class":140},[134,3033,2854],{"class":231},[134,3035,235],{"class":144},[134,3037,3038],{"class":231},"table_name\n",[134,3040,3042],{"class":136,"line":3041},160,[134,3043,248],{"emptyLinePlaceholder":247},[134,3045,3047,3049,3051,3053,3055],{"class":136,"line":3046},161,[134,3048,273],{"class":140},[134,3050,2880],{"class":231},[134,3052,235],{"class":144},[134,3054,2811],{"class":231},[134,3056,3057],{"class":144},";\n",[12,3059,3060],{},[64,3061],{"alt":3062,"src":3063},"クエリ結果テーブル","https://res.cloudinary.com/about-gitlab-com/image/upload/v1758030995/guicjhzwvrz3czwjs3xo.png",[12,3065,3066],{},"このクエリを実行した結果：",[81,3068,3069,3075,3081],{},[42,3070,3071,3072],{},"重複除去後の行数に",[87,3073,3074],{},"差異なし",[42,3076,3077,3078],{},"全テーブルで",[87,3079,3080],{},"100%のデータ保持",[42,3082,3083,3086],{},[87,3084,3085],{},"すべてのテスト","が正常に完了",[26,3088,3090],{"id":3089},"結論大幅な時間短縮","結論：大幅な時間短縮",[81,3092,3093,3099],{},[42,3094,3095,3098],{},[87,3096,3097],{},"従来のアプローチ："," 手動コーディング、テスト、デバッグで6-8時間",[42,3100,3101,3104],{},[87,3102,3103],{},"GitLab Duoを活用："," 生成 + レビュー時間で6-8分",[12,3106,3107],{},"開発効率が60倍に向上（6-8時間から6-8分へ）し、高品質なコードを確保できます。",[26,3109,3110],{"id":3110},"成功のためのベストプラクティス",[12,3112,3113],{},"本事例から得られた主要な推奨事項：",[524,3115,3116],{"id":3116},"メタデータの準備",[81,3118,3119,3122,3125],{},[42,3120,3121],{},"データ型や制約を含む完全なテーブル構造を抽出する",[42,3123,3124],{},"主キーと関係を事前に特定する",[42,3126,3127],{},"クリーンで適切にフォーマットされたCSV入力ファイルをエクスポートする",[12,3129,3130,3133],{},[87,3131,3132],{},"注："," GitLab DuoをMCP経由で（メタ）データに接続することで、この手動ステップを省略できる可能性があります。",[524,3135,3136],{"id":3136},"明確なコンテキストの提供",[81,3138,3139,3142,3145],{},[42,3140,3141],{},"可能な限り既存のMR例を参照例として示す",[42,3143,3144],{},"コーディング標準とスタイルガイドを明示する",[42,3146,3147],{},"フォルダー構造と命名規則について明確に指定する",[524,3149,3150],{"id":3150},"徹底的な検証",[81,3152,3153,3156,3159],{},[42,3154,3155],{},"データ整合性を確認する検証クエリを必ず作成する",[42,3157,3158],{},"マージ前にローカルでテストする",[42,3160,3161],{},"CI/CDパイプラインを実行して問題を検出する",[524,3163,3165],{"id":3164},"aiを活用したフォローアップ作業","AIを活用したフォローアップ作業",[81,3167,3168,3171,3174],{},[42,3169,3170],{},"テストクエリを自動生成する",[42,3172,3173],{},"ドキュメントテンプレートを作成する",[42,3175,3176],{},"検証スクリプトを構築する",[26,3178,3179],{"id":3179},"今後の展開",[12,3181,3182],{},"本ガイドでは、GitLab DuoをはじめとするAI搭載開発ツールがデータエンジニアリングワークフローをいかに変革しているかを示しました。テスト、ドキュメント、適切な構造を含む数百行の本番対応コードを数分で生成できる能力は、反復的な開発タスクへのアプローチの根本的な転換を表しています。",[12,3184,3185],{},"AIにdbtモデル作成の反復作業を委ねることで、データエンジニアはデータモデリング戦略、パフォーマンス最適化、ビジネスロジック実装などといった、より価値の高い業務に専念できます。",[12,3187,3188,3191],{},[87,3189,3190],{},"ぜひお試しください"," 小さなデータセットから着手し、メタデータを慎重に準備することで、GitLab Duoが何時間の作業をわずか数分の自動生成に変える様子を実感できます。",[3193,3194,3195],"blockquote",{},[12,3196,3197],{},[19,3198,3200],{"href":21,"rel":3199},[],"GitLab Duo Agent Platformを今すぐお試しください。",[26,3202,3203],{"id":3203},"さらに読む",[81,3205,3206,3213],{},[42,3207,3208],{},[19,3209,3212],{"href":3210,"rel":3211},"https://about.gitlab.com/ja-jp/blog/gitlab-18-3-expanding-ai-orchestration-in-software-engineering/",[],"GitLab 18.3: ソフトウェアエンジニアリングにおけるAIオーケストレーションの拡張",[42,3214,3215],{},[19,3216,3219],{"href":3217,"rel":3218},"https://about.gitlab.com/ja-jp/blog/gitlab-duo-agent-platform-public-beta/",[],"GitLab Duo Agent Platform ベータ版：次世代AIオーケストレーション",[3221,3222,3223],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":130,"searchDepth":148,"depth":148,"links":3225},[3226,3227,3228,3229,3230,3231,3234,3235,3236,3242,3243],{"id":28,"depth":148,"text":28},{"id":113,"depth":148,"text":114},{"id":314,"depth":148,"text":315},{"id":341,"depth":148,"text":342},{"id":385,"depth":148,"text":386},{"id":457,"depth":148,"text":457,"children":3232},[3233],{"id":526,"depth":154,"text":526},{"id":1207,"depth":148,"text":1208},{"id":3089,"depth":148,"text":3090},{"id":3110,"depth":148,"text":3110,"children":3237},[3238,3239,3240,3241],{"id":3116,"depth":154,"text":3116},{"id":3136,"depth":154,"text":3136},{"id":3150,"depth":154,"text":3150},{"id":3164,"depth":154,"text":3165},{"id":3179,"depth":148,"text":3179},{"id":3203,"depth":148,"text":3203},"ai","2025-09-16","本ブログでは、dbtモデル作成方法を詳しく解説し、何時間もかかっていた手動コーディングを、わずか数分の自動生成に変える方法をご紹介します。","md",null,"blog/hero%20images/workflow_1800x945.png",{},"/ja-jp/blog/how-gitlab-duo-agent-platform-transforms-dataops",{"title":5,"description":3246},"how-gitlab-duo-agent-platform-transforms-dataops","ja-jp/blog/how-gitlab-duo-agent-platform-transforms-dataops",[3256,3257,3258],"product","tutorial","features","BlogPost","2025-09-30","1zODhD9UfJBkcmxLKWXNH6tm2x7P-6rswJFU5b7I9rE",{"logo":3263,"freeTrial":3268,"sales":3273,"login":3278,"items":3283,"search":3611,"minimal":3644,"duo":3661,"switchNav":3670,"pricingDeployment":3681},{"config":3264},{"href":3265,"dataGaName":3266,"dataGaLocation":3267},"/ja-jp/","gitlab logo","header",{"text":3269,"config":3270},"無料トライアルを開始",{"href":3271,"dataGaName":3272,"dataGaLocation":3267},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp&glm_content=default-saas-trial/","free trial",{"text":3274,"config":3275},"デモをリクエスト",{"href":3276,"dataGaName":3277,"dataGaLocation":3267},"/ja-jp/sales/?contact-topic=request-demo","sales",{"text":3279,"config":3280},"サインイン",{"href":3281,"dataGaName":3282,"dataGaLocation":3267},"https://gitlab.com/users/sign_in/","sign in",[3284,3312,3414,3419,3533,3589],{"text":3285,"config":3286,"menu":3288},"プラットフォーム",{"dataNavLevelOne":3287},"platform",{"type":3289,"columns":3290},"cards",[3291,3297,3304],{"title":3285,"description":3292,"link":3293},"DevSecOpsに特化したインテリジェントオーケストレーションプラットフォーム",{"text":3294,"config":3295},"プラットフォームの詳細はこちら",{"href":3296,"dataGaName":3287,"dataGaLocation":3267},"/ja-jp/platform/",{"title":23,"description":3298,"link":3299},"ソフトウェアライフサイクル全体を支えるエージェント型AI",{"text":3300,"config":3301},"GitLab Duoのご紹介",{"href":3302,"dataGaName":3303,"dataGaLocation":3267},"/ja-jp/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":3305,"description":3306,"link":3307},"GitLabが選ばれる理由","エンタープライズがGitLabを選ぶ主な理由をご覧ください",{"text":3308,"config":3309},"詳細はこちら",{"href":3310,"dataGaName":3311,"dataGaLocation":3267},"/ja-jp/why-gitlab/","why gitlab",{"text":3313,"left":247,"config":3314,"menu":3316},"製品",{"dataNavLevelOne":3315},"solutions",{"type":3317,"link":3318,"columns":3322,"feature":3393},"lists",{"text":3319,"config":3320},"すべてのソリューションを表示",{"href":3321,"dataGaName":3315,"dataGaLocation":3267},"/ja-jp/solutions/",[3323,3348,3371],{"title":3324,"description":3325,"link":3326,"items":3331},"自動化","CI/CDと自動化でデプロイを加速",{"config":3327},{"icon":3328,"href":3329,"dataGaName":3330,"dataGaLocation":3267},"AutomatedCodeAlt","/ja-jp/solutions/delivery-automation/","automated software delivery",[3332,3336,3339,3344],{"text":3333,"config":3334},"CI/CD",{"href":3335,"dataGaLocation":3267,"dataGaName":3333},"/ja-jp/solutions/continuous-integration/",{"text":23,"config":3337},{"href":3302,"dataGaLocation":3267,"dataGaName":3338},"gitlab duo agent platform - product menu",{"text":3340,"config":3341},"ソースコード管理",{"href":3342,"dataGaLocation":3267,"dataGaName":3343},"/ja-jp/solutions/source-code-management/","Source Code Management",{"text":3345,"config":3346},"自動化されたソフトウェアデリバリー",{"href":3329,"dataGaLocation":3267,"dataGaName":3347},"Automated software delivery",{"title":3349,"description":3350,"link":3351,"items":3356},"セキュリティ","セキュリティを犠牲にすることなくコード作成を高速化",{"config":3352},{"href":3353,"dataGaName":3354,"dataGaLocation":3267,"icon":3355},"/ja-jp/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[3357,3361,3366],{"text":3358,"config":3359},"アプリケーションセキュリティテスト",{"href":3353,"dataGaName":3360,"dataGaLocation":3267},"Application security testing",{"text":3362,"config":3363},"ソフトウェアサプライチェーンセキュリティ",{"href":3364,"dataGaLocation":3267,"dataGaName":3365},"/ja-jp/solutions/supply-chain/","Software supply chain security",{"text":3367,"config":3368},"ソフトウェアコンプライアンス",{"href":3369,"dataGaName":3370,"dataGaLocation":3267},"/ja-jp/solutions/software-compliance/","software compliance",{"title":3372,"link":3373,"items":3378},"測定",{"config":3374},{"icon":3375,"href":3376,"dataGaName":3377,"dataGaLocation":3267},"DigitalTransformation","/ja-jp/solutions/visibility-measurement/","visibility and measurement",[3379,3383,3388],{"text":3380,"config":3381},"可視性と測定",{"href":3376,"dataGaLocation":3267,"dataGaName":3382},"Visibility and Measurement",{"text":3384,"config":3385},"バリューストリーム管理",{"href":3386,"dataGaLocation":3267,"dataGaName":3387},"/ja-jp/solutions/value-stream-management/","Value Stream Management",{"text":3389,"config":3390},"分析とインサイト",{"href":3391,"dataGaLocation":3267,"dataGaName":3392},"/ja-jp/solutions/analytics-and-insights/","Analytics and insights",{"title":3394,"type":3317,"items":3395},"GitLabが活躍する場所",[3396,3402,3408],{"text":3397,"config":3398},"大企業",{"icon":3399,"href":3400,"dataGaLocation":3267,"dataGaName":3401},"Building","/ja-jp/enterprise/","enterprise",{"text":3403,"config":3404},"スモールビジネス",{"icon":3405,"href":3406,"dataGaLocation":3267,"dataGaName":3407},"Work","/ja-jp/small-business/","small business",{"text":3409,"config":3410},"公共部門",{"icon":3411,"href":3412,"dataGaLocation":3267,"dataGaName":3413},"Organization","/ja-jp/solutions/public-sector/","public sector",{"text":3415,"config":3416},"価格",{"href":3417,"dataGaName":3418,"dataGaLocation":3267,"dataNavLevelOne":3418},"/ja-jp/pricing/","pricing",{"text":3420,"config":3421,"menu":3423},"関連リソース",{"dataNavLevelOne":3422},"resources",{"type":3317,"link":3424,"columns":3428,"feature":3522},{"text":3425,"config":3426},"すべてのリソースを表示",{"href":3427,"dataGaName":3422,"dataGaLocation":3267},"/ja-jp/resources/",[3429,3462,3489],{"title":3430,"items":3431},"はじめに",[3432,3437,3442,3447,3452,3457],{"text":3433,"config":3434},"インストール",{"href":3435,"dataGaName":3436,"dataGaLocation":3267},"/ja-jp/install/","install",{"text":3438,"config":3439},"クイックスタートガイド",{"href":3440,"dataGaName":3441,"dataGaLocation":3267},"/ja-jp/get-started/","quick setup checklists",{"text":3443,"config":3444},"学ぶ",{"href":3445,"dataGaLocation":3267,"dataGaName":3446},"https://university.gitlab.com/","learn",{"text":3448,"config":3449},"製品ドキュメント",{"href":3450,"dataGaName":3451,"dataGaLocation":3267},"https://docs.gitlab.com/ja-jp/","product documentation",{"text":3453,"config":3454},"ベストプラクティスビデオ",{"href":3455,"dataGaName":3456,"dataGaLocation":3267},"/ja-jp/getting-started-videos/","best practice videos",{"text":3458,"config":3459},"インテグレーション",{"href":3460,"dataGaName":3461,"dataGaLocation":3267},"/ja-jp/integrations/","integrations",{"title":3463,"items":3464},"検索する",[3465,3470,3475,3480,3484],{"text":3466,"config":3467},"お客様成功事例",{"href":3468,"dataGaName":3469,"dataGaLocation":3267},"/ja-jp/customers/","customer success stories",{"text":3471,"config":3472},"ブログ",{"href":3473,"dataGaName":3474,"dataGaLocation":3267},"/ja-jp/blog/","blog",{"text":3476,"config":3477},"Demo Hub",{"href":3478,"dataGaName":3479,"dataGaLocation":3267},"/ja-jp/demo-hub/","demo hub",{"text":3481,"config":3482},"The Source",{"href":3483,"dataGaName":3474,"dataGaLocation":3267},"/ja-jp/the-source/",{"text":3485,"config":3486},"リモート",{"href":3487,"dataGaName":3488,"dataGaLocation":3267},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":3490,"items":3491},"つなげる",[3492,3497,3502,3507,3512,3517],{"text":3493,"config":3494},"GitLabサービス",{"href":3495,"dataGaName":3496,"dataGaLocation":3267},"/ja-jp/services/","services",{"text":3498,"config":3499},"コントリビュート",{"href":3500,"dataGaName":3501,"dataGaLocation":3267},"https://contributors.gitlab.com","contribute",{"text":3503,"config":3504},"コミュニティ",{"href":3505,"dataGaName":3506,"dataGaLocation":3267},"/community/","community",{"text":3508,"config":3509},"フォーラム",{"href":3510,"dataGaName":3511,"dataGaLocation":3267},"https://forum.gitlab.com/","forum",{"text":3513,"config":3514},"イベント",{"href":3515,"dataGaName":3516,"dataGaLocation":3267},"/events/","events",{"text":3518,"config":3519},"パートナー",{"href":3520,"dataGaName":3521,"dataGaLocation":3267},"/ja-jp/partners/","partners",{"config":3523,"title":3526,"text":3527,"link":3528},{"background":3524,"textColor":3525},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","GitLabの最新情報","最新の機能と改善点に関する情報をお届けします。",{"text":3529,"config":3530},"最新情報を読む",{"href":3531,"dataGaName":3532,"dataGaLocation":3267},"/ja-jp/whats-new/","whats new",{"text":3534,"config":3535,"menu":3537},"企業情報",{"dataNavLevelOne":3536},"company",{"type":3317,"columns":3538},[3539],{"items":3540},[3541,3546,3552,3554,3559,3564,3569,3574,3579,3584],{"text":3542,"config":3543},"GitLabについて",{"href":3544,"dataGaName":3545,"dataGaLocation":3267},"/ja-jp/company/","about",{"text":3547,"config":3548,"footerGa":3551},"採用情報",{"href":3549,"dataGaName":3550,"dataGaLocation":3267},"/jobs/","jobs",{"dataGaName":3550},{"text":3513,"config":3553},{"href":3515,"dataGaName":3516,"dataGaLocation":3267},{"text":3555,"config":3556},"経営陣",{"href":3557,"dataGaName":3558,"dataGaLocation":3267},"/company/team/e-group/","leadership",{"text":3560,"config":3561},"ハンドブック",{"href":3562,"dataGaName":3563,"dataGaLocation":3267},"https://handbook.gitlab.com/","handbook",{"text":3565,"config":3566},"投資家向け情報",{"href":3567,"dataGaName":3568,"dataGaLocation":3267},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":3570,"config":3571},"トラストセンター",{"href":3572,"dataGaName":3573,"dataGaLocation":3267},"/ja-jp/security/","trust center",{"text":3575,"config":3576},"AI Transparency Center",{"href":3577,"dataGaName":3578,"dataGaLocation":3267},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":3580,"config":3581},"ニュースレター",{"href":3582,"dataGaName":3583,"dataGaLocation":3267},"/company/contact/#contact-forms","newsletter",{"text":3585,"config":3586},"プレス",{"href":3587,"dataGaName":3588,"dataGaLocation":3267},"/press/","press",{"text":3590,"config":3591,"menu":3592},"お問い合わせ",{"dataNavLevelOne":3536},{"type":3317,"columns":3593},[3594],{"items":3595},[3596,3601,3606],{"text":3597,"config":3598},"お問い合わせはこちら",{"href":3599,"dataGaName":3600,"dataGaLocation":3267},"/ja-jp/sales/","talk to sales",{"text":3602,"config":3603},"サポートを受ける",{"href":3604,"dataGaName":3605,"dataGaLocation":3267},"https://support.gitlab.com/hc/en-us","support portal",{"text":3607,"config":3608},"カスタマーポータル",{"href":3609,"dataGaName":3610,"dataGaLocation":3267},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":3612,"login":3613,"suggestions":3620},"閉じる",{"text":3614,"link":3615},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":3616,"config":3617},"GitLab.com",{"href":3281,"dataGaName":3618,"dataGaLocation":3619},"search login","search",{"text":3621,"default":3622},"提案",[3623,3625,3630,3632,3636,3640],{"text":23,"config":3624},{"href":3302,"dataGaName":23,"dataGaLocation":3619},{"text":3626,"config":3627},"コード提案（AI）",{"href":3628,"dataGaName":3629,"dataGaLocation":3619},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":3333,"config":3631},{"href":3335,"dataGaName":3333,"dataGaLocation":3619},{"text":3633,"config":3634},"GitLab on AWS",{"href":3635,"dataGaName":3633,"dataGaLocation":3619},"/ja-jp/partners/technology-partners/aws/",{"text":3637,"config":3638},"GitLab on Google Cloud",{"href":3639,"dataGaName":3637,"dataGaLocation":3619},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":3641,"config":3642},"GitLabを選ぶ理由",{"href":3310,"dataGaName":3643,"dataGaLocation":3619},"Why GitLab?",{"freeTrial":3645,"mobileIcon":3649,"desktopIcon":3654,"secondaryButton":3657},{"text":3269,"config":3646},{"href":3647,"dataGaName":3272,"dataGaLocation":3648},"https://gitlab.com/-/trials/new/","nav",{"altText":3650,"config":3651},"GitLabアイコン",{"src":3652,"dataGaName":3653,"dataGaLocation":3648},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":3650,"config":3655},{"src":3656,"dataGaName":3653,"dataGaLocation":3648},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":3430,"config":3658},{"href":3659,"dataGaName":3660,"dataGaLocation":3648},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/get-started/","get started",{"freeTrial":3662,"mobileIcon":3666,"desktopIcon":3668},{"text":3663,"config":3664},"GitLab Duoの詳細について",{"href":3302,"dataGaName":3665,"dataGaLocation":3648},"gitlab duo",{"altText":3650,"config":3667},{"src":3652,"dataGaName":3653,"dataGaLocation":3648},{"altText":3650,"config":3669},{"src":3656,"dataGaName":3653,"dataGaLocation":3648},{"button":3671,"mobileIcon":3676,"desktopIcon":3678},{"text":3672,"config":3673},"/switch",{"href":3674,"dataGaName":3675,"dataGaLocation":3648},"#contact","switch",{"altText":3650,"config":3677},{"src":3652,"dataGaName":3653,"dataGaLocation":3648},{"altText":3650,"config":3679},{"src":3680,"dataGaName":3653,"dataGaLocation":3648},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":3682,"mobileIcon":3687,"desktopIcon":3689},{"text":3683,"config":3684},"料金ページに戻る",{"href":3417,"dataGaName":3685,"dataGaLocation":3648,"icon":3686},"back to pricing","GoBack",{"altText":3650,"config":3688},{"src":3652,"dataGaName":3653,"dataGaLocation":3648},{"altText":3650,"config":3690},{"src":3656,"dataGaName":3653,"dataGaLocation":3648},{"title":3692,"button":3693,"config":3697},"GitLab Orbitが登場: AIエージェントのためのコンテキストレイヤー",{"text":3308,"config":3694},{"href":3695,"dataGaName":3696,"dataGaLocation":3267},"/ja-jp/gitlab-orbit/","orbit",{"layout":3698,"disabled":3699},"release",false,{"data":3701},{"text":3702,"source":3703,"edit":3709,"contribute":3714,"config":3719,"items":3724,"minimal":3933},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":3704,"config":3705},"ページのソースを表示",{"href":3706,"dataGaName":3707,"dataGaLocation":3708},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":3710,"config":3711},"このページを編集",{"href":3712,"dataGaName":3713,"dataGaLocation":3708},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":3715,"config":3716},"ご協力をお願いします",{"href":3717,"dataGaName":3718,"dataGaLocation":3708},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":3720,"facebook":3721,"youtube":3722,"linkedin":3723},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[3725,3770,3823,3866,3900],{"title":3415,"links":3726,"subMenu":3741},[3727,3731,3736],{"text":3728,"config":3729},"プランの表示",{"href":3417,"dataGaName":3730,"dataGaLocation":3708},"view plans",{"text":3732,"config":3733},"Premiumを選ぶ理由",{"href":3734,"dataGaName":3735,"dataGaLocation":3708},"/ja-jp/pricing/premium/","why premium",{"text":3737,"config":3738},"Ultimateを選ぶ理由",{"href":3739,"dataGaName":3740,"dataGaLocation":3708},"/ja-jp/pricing/ultimate/","why ultimate",[3742],{"title":3590,"links":3743},[3744,3746,3748,3750,3755,3760,3765],{"text":3590,"config":3745},{"href":3599,"dataGaName":3277,"dataGaLocation":3708},{"text":3602,"config":3747},{"href":3604,"dataGaName":3605,"dataGaLocation":3708},{"text":3607,"config":3749},{"href":3609,"dataGaName":3610,"dataGaLocation":3708},{"text":3751,"config":3752},"ステータス",{"href":3753,"dataGaName":3754,"dataGaLocation":3708},"https://status.gitlab.com/","status",{"text":3756,"config":3757},"利用規約",{"href":3758,"dataGaName":3759,"dataGaLocation":3708},"/terms/","terms of use",{"text":3761,"config":3762},"プライバシーに関する声明",{"href":3763,"dataGaName":3764,"dataGaLocation":3708},"/ja-jp/privacy/","privacy statement",{"text":3766,"config":3767},"Cookie 優先設定",{"dataGaName":3768,"dataGaLocation":3708,"id":3769,"isOneTrustButton":247},"cookie preferences","ot-sdk-btn",{"title":3313,"links":3771,"subMenu":3780},[3772,3776],{"text":3773,"config":3774},"DevSecOpsプラットフォーム",{"href":3296,"dataGaName":3775,"dataGaLocation":3708},"devsecops platform",{"text":3777,"config":3778},"AI支援開発",{"href":3302,"dataGaName":3779,"dataGaLocation":3708},"ai-assisted development",[3781],{"title":3782,"links":3783},"トピック",[3784,3788,3793,3798,3803,3808,3813,3818],{"text":3333,"config":3785},{"href":3786,"dataGaName":3787,"dataGaLocation":3708},"/ja-jp/topics/ci-cd/","cicd",{"text":3789,"config":3790},"GitOps",{"href":3791,"dataGaName":3792,"dataGaLocation":3708},"/ja-jp/topics/gitops/","gitops",{"text":3794,"config":3795},"DevOps",{"href":3796,"dataGaName":3797,"dataGaLocation":3708},"/ja-jp/topics/devops/","devops",{"text":3799,"config":3800},"バージョン管理",{"href":3801,"dataGaName":3802,"dataGaLocation":3708},"/ja-jp/topics/version-control/","version control",{"text":3804,"config":3805},"DevSecOps",{"href":3806,"dataGaName":3807,"dataGaLocation":3708},"/ja-jp/topics/devsecops/","devsecops",{"text":3809,"config":3810},"クラウドネイティブ",{"href":3811,"dataGaName":3812,"dataGaLocation":3708},"/ja-jp/topics/cloud-native/","cloud native",{"text":3814,"config":3815},"コーディングのためのAI",{"href":3816,"dataGaName":3817,"dataGaLocation":3708},"/ja-jp/topics/devops/ai-for-coding/","ai for coding",{"text":3819,"config":3820},"エージェント型AI",{"href":3821,"dataGaName":3822,"dataGaLocation":3708},"/ja-jp/topics/agentic-ai/","agentic ai",{"title":3824,"links":3825},"ソリューション",[3826,3829,3831,3836,3840,3843,3846,3849,3851,3853,3856,3861],{"text":3358,"config":3827},{"href":3353,"dataGaName":3828,"dataGaLocation":3708},"Application Security Testing",{"text":3345,"config":3830},{"href":3329,"dataGaName":3330,"dataGaLocation":3708},{"text":3832,"config":3833},"アジャイル開発",{"href":3834,"dataGaName":3835,"dataGaLocation":3708},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":3837,"config":3838},"SCM",{"href":3342,"dataGaName":3839,"dataGaLocation":3708},"source code management",{"text":3333,"config":3841},{"href":3335,"dataGaName":3842,"dataGaLocation":3708},"continuous integration & delivery",{"text":3384,"config":3844},{"href":3386,"dataGaName":3845,"dataGaLocation":3708},"value stream management",{"text":3789,"config":3847},{"href":3848,"dataGaName":3792,"dataGaLocation":3708},"/ja-jp/solutions/gitops/",{"text":3397,"config":3850},{"href":3400,"dataGaName":3401,"dataGaLocation":3708},{"text":3403,"config":3852},{"href":3406,"dataGaName":3407,"dataGaLocation":3708},{"text":3854,"config":3855},"公共機関",{"href":3412,"dataGaName":3413,"dataGaLocation":3708},{"text":3857,"config":3858},"教育",{"href":3859,"dataGaName":3860,"dataGaLocation":3708},"/ja-jp/solutions/education/","education",{"text":3862,"config":3863},"金融サービス",{"href":3864,"dataGaName":3865,"dataGaLocation":3708},"/ja-jp/solutions/finance/","financial services",{"title":3867,"links":3868},"リソース",[3869,3871,3873,3875,3879,3881,3884,3886,3888,3890,3892,3894,3896,3898],{"text":3433,"config":3870},{"href":3435,"dataGaName":3436,"dataGaLocation":3708},{"text":3438,"config":3872},{"href":3440,"dataGaName":3441,"dataGaLocation":3708},{"text":3443,"config":3874},{"href":3445,"dataGaName":3446,"dataGaLocation":3708},{"text":3448,"config":3876},{"href":3877,"dataGaName":3878,"dataGaLocation":3708},"https://docs.gitlab.com/ja-jp","docs",{"text":3471,"config":3880},{"href":3473,"dataGaName":3474,"dataGaLocation":3708},{"text":3882,"config":3883},"最新リリース",{"href":3531,"dataGaName":3532,"dataGaLocation":3708},{"text":3466,"config":3885},{"href":3468,"dataGaName":3469,"dataGaLocation":3708},{"text":3485,"config":3887},{"href":3487,"dataGaName":3488,"dataGaLocation":3708},{"text":3493,"config":3889},{"href":3495,"dataGaName":3496,"dataGaLocation":3708},{"text":3498,"config":3891},{"href":3500,"dataGaName":3501,"dataGaLocation":3708},{"text":3503,"config":3893},{"href":3505,"dataGaName":3506,"dataGaLocation":3708},{"text":3508,"config":3895},{"href":3510,"dataGaName":3511,"dataGaLocation":3708},{"text":3513,"config":3897},{"href":3515,"dataGaName":3516,"dataGaLocation":3708},{"text":3518,"config":3899},{"href":3520,"dataGaName":3521,"dataGaLocation":3708},{"title":3901,"links":3902},"会社情報",[3903,3905,3907,3909,3911,3913,3917,3922,3924,3926,3928],{"text":3542,"config":3904},{"href":3544,"dataGaName":3536,"dataGaLocation":3708},{"text":3547,"config":3906},{"href":3549,"dataGaName":3550,"dataGaLocation":3708},{"text":3555,"config":3908},{"href":3557,"dataGaName":3558,"dataGaLocation":3708},{"text":3560,"config":3910},{"href":3562,"dataGaName":3563,"dataGaLocation":3708},{"text":3565,"config":3912},{"href":3567,"dataGaName":3568,"dataGaLocation":3708},{"text":3914,"config":3915},"Sustainability",{"href":3916,"dataGaName":3914,"dataGaLocation":3708},"/sustainability/",{"text":3918,"config":3919},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":3920,"dataGaName":3921,"dataGaLocation":3708},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":3570,"config":3923},{"href":3572,"dataGaName":3573,"dataGaLocation":3708},{"text":3580,"config":3925},{"href":3582,"dataGaName":3583,"dataGaLocation":3708},{"text":3585,"config":3927},{"href":3587,"dataGaName":3588,"dataGaLocation":3708},{"text":3929,"config":3930},"現代奴隷制の透明性に関する声明",{"href":3931,"dataGaName":3932,"dataGaLocation":3708},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":3934},[3935,3937,3940],{"text":3756,"config":3936},{"href":3758,"dataGaName":3759,"dataGaLocation":3708},{"text":3938,"config":3939},"Cookieの設定",{"dataGaName":3768,"dataGaLocation":3708,"id":3769,"isOneTrustButton":247},{"text":3761,"config":3941},{"href":3763,"dataGaName":3764,"dataGaLocation":3708},[3943],{"id":3944,"title":3945,"body":3248,"config":3946,"content":3949,"description":3248,"extension":3952,"meta":3953,"navigation":247,"path":3954,"seo":3955,"stem":3956,"__hash__":3957},"blogAuthors/en-us/blog/authors/dennis-van-rooijen.yml","Dennis Van Rooijen",{"template":3947,"gitlabHandle":3948},"BlogAuthor","dvanrooijen2",{"name":7,"config":3950},{"headshot":3951},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758031391/muvwg1sxetzekmuhqdql.png","yml",{},"/en-us/blog/authors/dennis-van-rooijen",{},"en-us/blog/authors/dennis-van-rooijen","-VrBQM0MkpSMVi6cd_BwGMYKVgzryOCw3IxXukVkNGg",[3959,3967,3974],{"title":3960,"description":3961,"heroImage":3962,"category":3244,"date":3963,"authors":3964,"slug":3966,"externalUrl":3248},"Loop Engineeringの実践方法：GitLab × Claude Codeでの実装例","GitLabとClaude Codeで実践するLoop Engineeringの実装例をご紹介。AIエージェントを自律稼働させるcron起動・Skills活用・ラベルベースのフローと、必須のガードレール設計を解説します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785215335/oevhcbrbev1zyfubdfxz.jpg","2026-07-31",[3965],"Issei Hamada, Sony Biz Networks Corporation","loop-engineering-gitlab-claude-code",{"title":3968,"description":3969,"heroImage":3970,"category":3244,"date":3963,"authors":3971,"slug":3973,"externalUrl":3248},"エージェント型AI、MCP、AIコードアシスタントを統制する方法","AIエージェントは、各ステップで人によるレビューを介さずに、コードの記述、プッシュ、デプロイを行うことができます。アクセス、権限、監査証跡を統制する実践的なフレームワークを解説します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785337625/ifzlc2hyzaxhzmjgyymh.png",[3972],"Julie Griffin","govern-agentic-ai-mcps-code-assistants",{"title":3975,"description":3976,"heroImage":3977,"category":3244,"date":3978,"authors":3979,"slug":3981,"externalUrl":3248},"Claude Opus 5、GitLabで最難関タスクに挑む","AnthropicのClaude Opus 5がGitLab Duo Agent Platformで利用可能になりました。速度を犠牲にすることなく、より深い推論力を提供します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","2026-07-27",[3980],"Brittany Lutz","claude-opus-5-on-gitlab-duo-agent-platform",{"promotions":3983},[3984,3997,4008,4020],{"id":3985,"categories":3986,"header":3987,"text":3988,"button":3989,"image":3994},"ai-modernization",[3244],"AIの真価、組織全体で発揮できていますか？","所要時間は5分以内です",{"text":3990,"config":3991},"AI成熟度スコアを確認する",{"href":3992,"dataGaName":3993,"dataGaLocation":3474},"/ja-jp/assessments/ai-modernization-assessment/","modernization assessment",{"config":3995},{"src":3996},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":3998,"categories":3999,"header":4000,"text":3988,"button":4001,"image":4005},"devops-modernization",[3256,3807],"単にツールを管理するだけでなく、イノベーションを提供していますか？",{"text":4002,"config":4003},"DevOps成熟度スコアを確認しましょう",{"href":4004,"dataGaName":3993,"dataGaLocation":3474},"/ja-jp/assessments/devops-modernization-assessment/",{"config":4006},{"src":4007},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":4009,"categories":4010,"header":4012,"text":3988,"button":4013,"image":4017},"security-modernization",[4011],"security","スピードのためにセキュリティを犠牲にしていませんか？",{"text":4014,"config":4015},"セキュリティ成熟度スコアを確認しましょう",{"href":4016,"dataGaName":3993,"dataGaLocation":3474},"/ja-jp/assessments/security-modernization-assessment/",{"config":4018},{"src":4019},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":4021,"paths":4022,"header":4025,"text":4026,"button":4027,"image":4032},"github-azure-migration",[4023,4024],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","チームはGitHubのAzure移行に対応できていますか？","GitHubはすでにAzureを基盤として再構築を進めています。それがあなたのチームにとって何を意味するのか、ご確認ください。",{"text":4028,"config":4029},"GitLabとGitHubの比較を見る",{"href":4030,"dataGaName":4031,"dataGaLocation":3474},"/ja-jp/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":4033},{"src":4007},{"header":4035,"blurb":4036,"button":4037,"secondaryButton":4041},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":3269,"config":4038},{"href":4039,"dataGaName":3272,"dataGaLocation":4040},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/","feature",{"text":3590,"config":4042},{"href":3599,"dataGaName":3277,"dataGaLocation":4040},1786803790711]