[{"data":1,"prerenderedAt":3129},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fde\u002Fdata\u002Fdbt-bigquery-moderner-marketing-data-stack":13},{"i18nKey":4,"paths":5},"data-002-2026-06",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fdata\u002Fdbt-bigquery-moderner-marketing-data-stack","\u002Fen\u002Fdata\u002Fdbt-bigquery-modern-marketing-data-stack","\u002Fes\u002Fdata\u002Fdbt-bigquery-modern-marketing-data-stack","\u002Ffr\u002Fdata\u002Fdbt-bigquery-modern-marketing-data-stack","\u002Fit\u002Fdata\u002Fdbt-bigquery-modern-pazarlama-data-stack","\u002Fru\u002Fdata\u002Fdbt-bigquery-sovremenniy-marketing-data-stack","\u002Ftr\u002Fdata\u002Fdbt-bigquery-ile-modern-pazarlama-data-stack",{"_path":6,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":3123,"_id":3124,"_source":3125,"_file":3126,"_stem":3127,"_extension":3128},"data",false,"","dbt + BigQuery: Moderner Marketing Data Stack","Von der Source-Zuordnung bis zur Semantic Layer: Wie Sie Marketing-Daten in Entscheidungsintelligenz verwandeln. dbt-Modellierung, Exposure-Definitionen und Production-Pipeline-Architektur.","2026-06-14",[21,22,23,24,25],"dbt","bigquery","data-modeling","semantic-layer","marketing-analytics",9,"Roibase",{"type":29,"children":30,"toc":3113},"root",[31,39,46,84,350,379,400,406,418,701,714,1043,1102,1108,1120,1483,1488,1520,1526,1546,1750,1770,1783,1890,1895,1901,1914,2191,2204,2216,2478,2499,2505,2510,2763,2768,2788,2962,2967,2973,2978,2983,2988,3091,3096,3102,3107],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","Marketing-Teams treffen 2026 keine Entscheidungen trotz Daten, sondern mit Daten. GA4, Meta Ads, Google Ads, CRM, CDP, Server-Side GTM — jedes System fällt in eine separate Tabelle. Teams kleben Ergebnisse in Spreadsheets zusammen, Zahlen ändern sich jede Woche, niemand vertraut den Metriken. Dieser Chaos verschwindet mit dem modernen Data Stack: BigQuery als Quelle, dbt als Transformationsschicht, Semantic Layer als Metrik-Netzwerk. Sie versionieren Code im Repository, jede Änderung wird getestet, Metriken kommen aus einer Single Source of Truth. Dieser Artikel zeigt, wie dbt + BigQuery Ihre Marketing-Pipeline auf Production-Grade heben.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"source-zuordnung-rohdaten-pfade-standardisieren",[44],{"type":37,"value":45},"Source-Zuordnung: Rohdaten-Pfade standardisieren",{"type":32,"tag":33,"props":47,"children":48},{},[49,51,58,60,66,68,74,76,82],{"type":37,"value":50},"dbt's erste Aufgabe ist Source-Zuordnung — Rohdaten aus verschiedenen Systemen in ein einheitliches Schema bringen. In BigQuery kommt ",{"type":32,"tag":52,"props":53,"children":55},"code",{"className":54},[],[56],{"type":37,"value":57},"analytics_123456.events_*",{"type":37,"value":59}," aus GA4, ",{"type":32,"tag":52,"props":61,"children":63},{"className":62},[],[64],{"type":37,"value":65},"facebook_ads.ads_insights",{"type":37,"value":67}," aus der Meta API, ",{"type":32,"tag":52,"props":69,"children":71},{"className":70},[],[72],{"type":37,"value":73},"crm.transactions",{"type":37,"value":75}," aus Shopify. Jede Quelle hat andere Timestamp-Formate, User-Identifier und Currency-Spalten. Sie definieren diese Raw-Tabellen in dbt's ",{"type":32,"tag":52,"props":77,"children":79},{"className":78},[],[80],{"type":37,"value":81},"sources.yml",{"type":37,"value":83},":",{"type":32,"tag":85,"props":86,"children":90},"pre",{"className":87,"code":88,"language":89,"meta":16,"style":16},"language-yaml shiki shiki-themes github-dark","version: 2\nsources:\n  - name: ga4\n    database: analytics_123456\n    tables:\n      - name: events_\n        identifier: \"events_*\"\n        loaded_at_field: event_timestamp\n  - name: meta_ads\n    database: facebook_ads\n    schema: public\n    tables:\n      - name: ads_insights\n        loaded_at_field: date_start\n","yaml",[91],{"type":32,"tag":52,"props":92,"children":93},{"__ignoreMap":16},[94,118,132,156,174,187,209,227,245,265,282,300,312,333],{"type":32,"tag":95,"props":96,"children":99},"span",{"class":97,"line":98},"line",1,[100,106,112],{"type":32,"tag":95,"props":101,"children":103},{"style":102},"--shiki-default:#85E89D",[104],{"type":37,"value":105},"version",{"type":32,"tag":95,"props":107,"children":109},{"style":108},"--shiki-default:#E1E4E8",[110],{"type":37,"value":111},": ",{"type":32,"tag":95,"props":113,"children":115},{"style":114},"--shiki-default:#79B8FF",[116],{"type":37,"value":117},"2\n",{"type":32,"tag":95,"props":119,"children":121},{"class":97,"line":120},2,[122,127],{"type":32,"tag":95,"props":123,"children":124},{"style":102},[125],{"type":37,"value":126},"sources",{"type":32,"tag":95,"props":128,"children":129},{"style":108},[130],{"type":37,"value":131},":\n",{"type":32,"tag":95,"props":133,"children":135},{"class":97,"line":134},3,[136,141,146,150],{"type":32,"tag":95,"props":137,"children":138},{"style":108},[139],{"type":37,"value":140},"  - ",{"type":32,"tag":95,"props":142,"children":143},{"style":102},[144],{"type":37,"value":145},"name",{"type":32,"tag":95,"props":147,"children":148},{"style":108},[149],{"type":37,"value":111},{"type":32,"tag":95,"props":151,"children":153},{"style":152},"--shiki-default:#9ECBFF",[154],{"type":37,"value":155},"ga4\n",{"type":32,"tag":95,"props":157,"children":159},{"class":97,"line":158},4,[160,165,169],{"type":32,"tag":95,"props":161,"children":162},{"style":102},[163],{"type":37,"value":164},"    database",{"type":32,"tag":95,"props":166,"children":167},{"style":108},[168],{"type":37,"value":111},{"type":32,"tag":95,"props":170,"children":171},{"style":152},[172],{"type":37,"value":173},"analytics_123456\n",{"type":32,"tag":95,"props":175,"children":177},{"class":97,"line":176},5,[178,183],{"type":32,"tag":95,"props":179,"children":180},{"style":102},[181],{"type":37,"value":182},"    tables",{"type":32,"tag":95,"props":184,"children":185},{"style":108},[186],{"type":37,"value":131},{"type":32,"tag":95,"props":188,"children":190},{"class":97,"line":189},6,[191,196,200,204],{"type":32,"tag":95,"props":192,"children":193},{"style":108},[194],{"type":37,"value":195},"      - ",{"type":32,"tag":95,"props":197,"children":198},{"style":102},[199],{"type":37,"value":145},{"type":32,"tag":95,"props":201,"children":202},{"style":108},[203],{"type":37,"value":111},{"type":32,"tag":95,"props":205,"children":206},{"style":152},[207],{"type":37,"value":208},"events_\n",{"type":32,"tag":95,"props":210,"children":212},{"class":97,"line":211},7,[213,218,222],{"type":32,"tag":95,"props":214,"children":215},{"style":102},[216],{"type":37,"value":217},"        identifier",{"type":32,"tag":95,"props":219,"children":220},{"style":108},[221],{"type":37,"value":111},{"type":32,"tag":95,"props":223,"children":224},{"style":152},[225],{"type":37,"value":226},"\"events_*\"\n",{"type":32,"tag":95,"props":228,"children":230},{"class":97,"line":229},8,[231,236,240],{"type":32,"tag":95,"props":232,"children":233},{"style":102},[234],{"type":37,"value":235},"        loaded_at_field",{"type":32,"tag":95,"props":237,"children":238},{"style":108},[239],{"type":37,"value":111},{"type":32,"tag":95,"props":241,"children":242},{"style":152},[243],{"type":37,"value":244},"event_timestamp\n",{"type":32,"tag":95,"props":246,"children":247},{"class":97,"line":26},[248,252,256,260],{"type":32,"tag":95,"props":249,"children":250},{"style":108},[251],{"type":37,"value":140},{"type":32,"tag":95,"props":253,"children":254},{"style":102},[255],{"type":37,"value":145},{"type":32,"tag":95,"props":257,"children":258},{"style":108},[259],{"type":37,"value":111},{"type":32,"tag":95,"props":261,"children":262},{"style":152},[263],{"type":37,"value":264},"meta_ads\n",{"type":32,"tag":95,"props":266,"children":268},{"class":97,"line":267},10,[269,273,277],{"type":32,"tag":95,"props":270,"children":271},{"style":102},[272],{"type":37,"value":164},{"type":32,"tag":95,"props":274,"children":275},{"style":108},[276],{"type":37,"value":111},{"type":32,"tag":95,"props":278,"children":279},{"style":152},[280],{"type":37,"value":281},"facebook_ads\n",{"type":32,"tag":95,"props":283,"children":285},{"class":97,"line":284},11,[286,291,295],{"type":32,"tag":95,"props":287,"children":288},{"style":102},[289],{"type":37,"value":290},"    schema",{"type":32,"tag":95,"props":292,"children":293},{"style":108},[294],{"type":37,"value":111},{"type":32,"tag":95,"props":296,"children":297},{"style":152},[298],{"type":37,"value":299},"public\n",{"type":32,"tag":95,"props":301,"children":303},{"class":97,"line":302},12,[304,308],{"type":32,"tag":95,"props":305,"children":306},{"style":102},[307],{"type":37,"value":182},{"type":32,"tag":95,"props":309,"children":310},{"style":108},[311],{"type":37,"value":131},{"type":32,"tag":95,"props":313,"children":315},{"class":97,"line":314},13,[316,320,324,328],{"type":32,"tag":95,"props":317,"children":318},{"style":108},[319],{"type":37,"value":195},{"type":32,"tag":95,"props":321,"children":322},{"style":102},[323],{"type":37,"value":145},{"type":32,"tag":95,"props":325,"children":326},{"style":108},[327],{"type":37,"value":111},{"type":32,"tag":95,"props":329,"children":330},{"style":152},[331],{"type":37,"value":332},"ads_insights\n",{"type":32,"tag":95,"props":334,"children":336},{"class":97,"line":335},14,[337,341,345],{"type":32,"tag":95,"props":338,"children":339},{"style":102},[340],{"type":37,"value":235},{"type":32,"tag":95,"props":342,"children":343},{"style":108},[344],{"type":37,"value":111},{"type":32,"tag":95,"props":346,"children":347},{"style":152},[348],{"type":37,"value":349},"date_start\n",{"type":32,"tag":33,"props":351,"children":352},{},[353,355,361,363,369,371,377],{"type":37,"value":354},"Diese Definition sagt dbt: \"Diese Tabellen sind Upstream-Quellen, ich modifiziere sie nicht, aber ich teste ihre Aktualität.\" Der Befehl ",{"type":32,"tag":52,"props":356,"children":358},{"className":357},[],[359],{"type":37,"value":360},"dbt source freshness",{"type":37,"value":362}," prüft, wann die letzten Daten eingegangen sind — wenn Meta API verzögert ist, bekommen Sie einen Alert. Ohne Source-Zuordnung schreibt jedes Modell direkt ",{"type":32,"tag":52,"props":364,"children":366},{"className":365},[],[367],{"type":37,"value":368},"SELECT * FROM analytics_123456.events_20260614",{"type":37,"value":370},". Ändert sich der Tabellenname, brechen 40 Modelle. Mit Zuordnung erfolgt die Referenzierung über ",{"type":32,"tag":52,"props":372,"children":374},{"className":373},[],[375],{"type":37,"value":376},"{{ source('ga4', 'events_') }}",{"type":37,"value":378}," — Änderungen verbreiten sich von einer zentralen Stelle.",{"type":32,"tag":33,"props":380,"children":381},{},[382,384,390,392,398],{"type":37,"value":383},"GA4 speichert event_timestamp als Unix-Mikrosekunde, Meta Ads date_start als ISO-String, CRM created_at als UTC-Datetime — jedes Format ist unterschiedlich. In der Source-Zuordnung standardisieren Sie einen Timestamp: ",{"type":32,"tag":52,"props":385,"children":387},{"className":386},[],[388],{"type":37,"value":389},"TIMESTAMP_MICROS(event_timestamp) AS event_time",{"type":37,"value":391}," für GA4, ",{"type":32,"tag":52,"props":393,"children":395},{"className":394},[],[396],{"type":37,"value":397},"PARSE_TIMESTAMP('%Y-%m-%d', date_start) AS event_time",{"type":37,"value":399}," für Meta. Diese Normalisierung liefert saubere Eingaben an nachgelagerte Modelle.",{"type":32,"tag":40,"props":401,"children":403},{"id":402},"modeling-layer-staging-intermediate-mart",[404],{"type":37,"value":405},"Modeling Layer: Staging, Intermediate, Mart",{"type":32,"tag":33,"props":407,"children":408},{},[409,411,417],{"type":37,"value":410},"dbt's Stärke liegt in geschichteter Modellierung — Staging-, Intermediate- und Mart-Schichten. Staging-Modelle ziehen 1:1 aus der Quelle, führen nur Umbenennung und Typ-Casting durch. ",{"type":32,"tag":52,"props":412,"children":414},{"className":413},[],[415],{"type":37,"value":416},"stg_ga4_events.sql",{"type":37,"value":83},{"type":32,"tag":85,"props":419,"children":423},{"className":420,"code":421,"language":422,"meta":16,"style":16},"language-sql shiki shiki-themes github-dark","SELECT\n  TIMESTAMP_MICROS(event_timestamp) AS event_time,\n  user_pseudo_id AS anonymous_id,\n  event_name,\n  (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'session_id') AS session_id,\n  geo.country,\n  device.category AS device_category\nFROM {{ source('ga4', 'events_') }}\nWHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))\n  AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())\n","sql",[424],{"type":32,"tag":52,"props":425,"children":426},{"__ignoreMap":16},[427,436,454,471,479,551,573,600,633,680],{"type":32,"tag":95,"props":428,"children":429},{"class":97,"line":98},[430],{"type":32,"tag":95,"props":431,"children":433},{"style":432},"--shiki-default:#F97583",[434],{"type":37,"value":435},"SELECT\n",{"type":32,"tag":95,"props":437,"children":438},{"class":97,"line":120},[439,444,449],{"type":32,"tag":95,"props":440,"children":441},{"style":108},[442],{"type":37,"value":443},"  TIMESTAMP_MICROS(event_timestamp) ",{"type":32,"tag":95,"props":445,"children":446},{"style":432},[447],{"type":37,"value":448},"AS",{"type":32,"tag":95,"props":450,"children":451},{"style":108},[452],{"type":37,"value":453}," event_time,\n",{"type":32,"tag":95,"props":455,"children":456},{"class":97,"line":134},[457,462,466],{"type":32,"tag":95,"props":458,"children":459},{"style":108},[460],{"type":37,"value":461},"  user_pseudo_id ",{"type":32,"tag":95,"props":463,"children":464},{"style":432},[465],{"type":37,"value":448},{"type":32,"tag":95,"props":467,"children":468},{"style":108},[469],{"type":37,"value":470}," anonymous_id,\n",{"type":32,"tag":95,"props":472,"children":473},{"class":97,"line":158},[474],{"type":32,"tag":95,"props":475,"children":476},{"style":108},[477],{"type":37,"value":478},"  event_name,\n",{"type":32,"tag":95,"props":480,"children":481},{"class":97,"line":176},[482,487,492,497,502,507,512,517,522,527,532,537,542,546],{"type":32,"tag":95,"props":483,"children":484},{"style":108},[485],{"type":37,"value":486},"  (",{"type":32,"tag":95,"props":488,"children":489},{"style":432},[490],{"type":37,"value":491},"SELECT",{"type":32,"tag":95,"props":493,"children":494},{"style":114},[495],{"type":37,"value":496}," value",{"type":32,"tag":95,"props":498,"children":499},{"style":108},[500],{"type":37,"value":501},".",{"type":32,"tag":95,"props":503,"children":504},{"style":114},[505],{"type":37,"value":506},"string_value",{"type":32,"tag":95,"props":508,"children":509},{"style":432},[510],{"type":37,"value":511}," FROM",{"type":32,"tag":95,"props":513,"children":514},{"style":108},[515],{"type":37,"value":516}," UNNEST(event_params) ",{"type":32,"tag":95,"props":518,"children":519},{"style":432},[520],{"type":37,"value":521},"WHERE",{"type":32,"tag":95,"props":523,"children":524},{"style":432},[525],{"type":37,"value":526}," key",{"type":32,"tag":95,"props":528,"children":529},{"style":432},[530],{"type":37,"value":531}," =",{"type":32,"tag":95,"props":533,"children":534},{"style":152},[535],{"type":37,"value":536}," 'session_id'",{"type":32,"tag":95,"props":538,"children":539},{"style":108},[540],{"type":37,"value":541},") ",{"type":32,"tag":95,"props":543,"children":544},{"style":432},[545],{"type":37,"value":448},{"type":32,"tag":95,"props":547,"children":548},{"style":108},[549],{"type":37,"value":550}," session_id,\n",{"type":32,"tag":95,"props":552,"children":553},{"class":97,"line":189},[554,559,563,568],{"type":32,"tag":95,"props":555,"children":556},{"style":114},[557],{"type":37,"value":558},"  geo",{"type":32,"tag":95,"props":560,"children":561},{"style":108},[562],{"type":37,"value":501},{"type":32,"tag":95,"props":564,"children":565},{"style":114},[566],{"type":37,"value":567},"country",{"type":32,"tag":95,"props":569,"children":570},{"style":108},[571],{"type":37,"value":572},",\n",{"type":32,"tag":95,"props":574,"children":575},{"class":97,"line":211},[576,581,585,590,595],{"type":32,"tag":95,"props":577,"children":578},{"style":114},[579],{"type":37,"value":580},"  device",{"type":32,"tag":95,"props":582,"children":583},{"style":108},[584],{"type":37,"value":501},{"type":32,"tag":95,"props":586,"children":587},{"style":114},[588],{"type":37,"value":589},"category",{"type":32,"tag":95,"props":591,"children":592},{"style":432},[593],{"type":37,"value":594}," AS",{"type":32,"tag":95,"props":596,"children":597},{"style":108},[598],{"type":37,"value":599}," device_category\n",{"type":32,"tag":95,"props":601,"children":602},{"class":97,"line":229},[603,608,613,618,623,628],{"type":32,"tag":95,"props":604,"children":605},{"style":432},[606],{"type":37,"value":607},"FROM",{"type":32,"tag":95,"props":609,"children":610},{"style":108},[611],{"type":37,"value":612}," {{ source(",{"type":32,"tag":95,"props":614,"children":615},{"style":152},[616],{"type":37,"value":617},"'ga4'",{"type":32,"tag":95,"props":619,"children":620},{"style":108},[621],{"type":37,"value":622},", ",{"type":32,"tag":95,"props":624,"children":625},{"style":152},[626],{"type":37,"value":627},"'events_'",{"type":32,"tag":95,"props":629,"children":630},{"style":108},[631],{"type":37,"value":632},") }}\n",{"type":32,"tag":95,"props":634,"children":635},{"class":97,"line":26},[636,640,645,650,655,660,665,670,675],{"type":32,"tag":95,"props":637,"children":638},{"style":432},[639],{"type":37,"value":521},{"type":32,"tag":95,"props":641,"children":642},{"style":108},[643],{"type":37,"value":644}," _TABLE_SUFFIX ",{"type":32,"tag":95,"props":646,"children":647},{"style":432},[648],{"type":37,"value":649},"BETWEEN",{"type":32,"tag":95,"props":651,"children":652},{"style":108},[653],{"type":37,"value":654}," FORMAT_DATE(",{"type":32,"tag":95,"props":656,"children":657},{"style":152},[658],{"type":37,"value":659},"'%Y%m%d'",{"type":32,"tag":95,"props":661,"children":662},{"style":108},[663],{"type":37,"value":664},", DATE_SUB(CURRENT_DATE(), INTERVAL ",{"type":32,"tag":95,"props":666,"children":667},{"style":114},[668],{"type":37,"value":669},"90",{"type":32,"tag":95,"props":671,"children":672},{"style":432},[673],{"type":37,"value":674}," DAY",{"type":32,"tag":95,"props":676,"children":677},{"style":108},[678],{"type":37,"value":679},"))\n",{"type":32,"tag":95,"props":681,"children":682},{"class":97,"line":267},[683,688,692,696],{"type":32,"tag":95,"props":684,"children":685},{"style":432},[686],{"type":37,"value":687},"  AND",{"type":32,"tag":95,"props":689,"children":690},{"style":108},[691],{"type":37,"value":654},{"type":32,"tag":95,"props":693,"children":694},{"style":152},[695],{"type":37,"value":659},{"type":32,"tag":95,"props":697,"children":698},{"style":108},[699],{"type":37,"value":700},", CURRENT_DATE())\n",{"type":32,"tag":33,"props":702,"children":703},{},[704,706,712],{"type":37,"value":705},"Staging liefert saubere Daten, aber keine Business-Logik. Intermediate-Modelle fügen geschäftliche Logik hinzu: Sessionization, Attribution, Funnel-Schritte. ",{"type":32,"tag":52,"props":707,"children":709},{"className":708},[],[710],{"type":37,"value":711},"int_sessions.sql",{"type":37,"value":713}," aggregiert GA4-Events auf Session-Ebene:",{"type":32,"tag":85,"props":715,"children":717},{"className":420,"code":716,"language":422,"meta":16,"style":16},"WITH session_events AS (\n  SELECT\n    session_id,\n    MIN(event_time) AS session_start,\n    MAX(event_time) AS session_end,\n    COUNT(DISTINCT CASE WHEN event_name = 'page_view' THEN event_time END) AS pageviews,\n    MAX(CASE WHEN event_name = 'purchase' THEN 1 ELSE 0 END) AS converted\n  FROM {{ ref('stg_ga4_events') }}\n  GROUP BY session_id\n)\nSELECT\n  *,\n  TIMESTAMP_DIFF(session_end, session_start, SECOND) AS duration_seconds\nFROM session_events\n",[718],{"type":32,"tag":52,"props":719,"children":720},{"__ignoreMap":16},[721,743,751,759,781,802,873,943,965,978,986,993,1005,1031],{"type":32,"tag":95,"props":722,"children":723},{"class":97,"line":98},[724,729,734,738],{"type":32,"tag":95,"props":725,"children":726},{"style":432},[727],{"type":37,"value":728},"WITH",{"type":32,"tag":95,"props":730,"children":731},{"style":108},[732],{"type":37,"value":733}," session_events ",{"type":32,"tag":95,"props":735,"children":736},{"style":432},[737],{"type":37,"value":448},{"type":32,"tag":95,"props":739,"children":740},{"style":108},[741],{"type":37,"value":742}," (\n",{"type":32,"tag":95,"props":744,"children":745},{"class":97,"line":120},[746],{"type":32,"tag":95,"props":747,"children":748},{"style":432},[749],{"type":37,"value":750},"  SELECT\n",{"type":32,"tag":95,"props":752,"children":753},{"class":97,"line":134},[754],{"type":32,"tag":95,"props":755,"children":756},{"style":108},[757],{"type":37,"value":758},"    session_id,\n",{"type":32,"tag":95,"props":760,"children":761},{"class":97,"line":158},[762,767,772,776],{"type":32,"tag":95,"props":763,"children":764},{"style":114},[765],{"type":37,"value":766},"    MIN",{"type":32,"tag":95,"props":768,"children":769},{"style":108},[770],{"type":37,"value":771},"(event_time) ",{"type":32,"tag":95,"props":773,"children":774},{"style":432},[775],{"type":37,"value":448},{"type":32,"tag":95,"props":777,"children":778},{"style":108},[779],{"type":37,"value":780}," session_start,\n",{"type":32,"tag":95,"props":782,"children":783},{"class":97,"line":176},[784,789,793,797],{"type":32,"tag":95,"props":785,"children":786},{"style":114},[787],{"type":37,"value":788},"    MAX",{"type":32,"tag":95,"props":790,"children":791},{"style":108},[792],{"type":37,"value":771},{"type":32,"tag":95,"props":794,"children":795},{"style":432},[796],{"type":37,"value":448},{"type":32,"tag":95,"props":798,"children":799},{"style":108},[800],{"type":37,"value":801}," session_end,\n",{"type":32,"tag":95,"props":803,"children":804},{"class":97,"line":189},[805,810,815,820,825,830,835,840,845,850,855,860,864,868],{"type":32,"tag":95,"props":806,"children":807},{"style":114},[808],{"type":37,"value":809},"    COUNT",{"type":32,"tag":95,"props":811,"children":812},{"style":108},[813],{"type":37,"value":814},"(",{"type":32,"tag":95,"props":816,"children":817},{"style":432},[818],{"type":37,"value":819},"DISTINCT",{"type":32,"tag":95,"props":821,"children":822},{"style":432},[823],{"type":37,"value":824}," CASE",{"type":32,"tag":95,"props":826,"children":827},{"style":432},[828],{"type":37,"value":829}," WHEN",{"type":32,"tag":95,"props":831,"children":832},{"style":108},[833],{"type":37,"value":834}," event_name ",{"type":32,"tag":95,"props":836,"children":837},{"style":432},[838],{"type":37,"value":839},"=",{"type":32,"tag":95,"props":841,"children":842},{"style":152},[843],{"type":37,"value":844}," 'page_view'",{"type":32,"tag":95,"props":846,"children":847},{"style":432},[848],{"type":37,"value":849}," THEN",{"type":32,"tag":95,"props":851,"children":852},{"style":108},[853],{"type":37,"value":854}," event_time ",{"type":32,"tag":95,"props":856,"children":857},{"style":432},[858],{"type":37,"value":859},"END",{"type":32,"tag":95,"props":861,"children":862},{"style":108},[863],{"type":37,"value":541},{"type":32,"tag":95,"props":865,"children":866},{"style":432},[867],{"type":37,"value":448},{"type":32,"tag":95,"props":869,"children":870},{"style":108},[871],{"type":37,"value":872}," pageviews,\n",{"type":32,"tag":95,"props":874,"children":875},{"class":97,"line":211},[876,880,884,889,893,897,901,906,910,915,920,925,930,934,938],{"type":32,"tag":95,"props":877,"children":878},{"style":114},[879],{"type":37,"value":788},{"type":32,"tag":95,"props":881,"children":882},{"style":108},[883],{"type":37,"value":814},{"type":32,"tag":95,"props":885,"children":886},{"style":432},[887],{"type":37,"value":888},"CASE",{"type":32,"tag":95,"props":890,"children":891},{"style":432},[892],{"type":37,"value":829},{"type":32,"tag":95,"props":894,"children":895},{"style":108},[896],{"type":37,"value":834},{"type":32,"tag":95,"props":898,"children":899},{"style":432},[900],{"type":37,"value":839},{"type":32,"tag":95,"props":902,"children":903},{"style":152},[904],{"type":37,"value":905}," 'purchase'",{"type":32,"tag":95,"props":907,"children":908},{"style":432},[909],{"type":37,"value":849},{"type":32,"tag":95,"props":911,"children":912},{"style":114},[913],{"type":37,"value":914}," 1",{"type":32,"tag":95,"props":916,"children":917},{"style":432},[918],{"type":37,"value":919}," ELSE",{"type":32,"tag":95,"props":921,"children":922},{"style":114},[923],{"type":37,"value":924}," 0",{"type":32,"tag":95,"props":926,"children":927},{"style":432},[928],{"type":37,"value":929}," END",{"type":32,"tag":95,"props":931,"children":932},{"style":108},[933],{"type":37,"value":541},{"type":32,"tag":95,"props":935,"children":936},{"style":432},[937],{"type":37,"value":448},{"type":32,"tag":95,"props":939,"children":940},{"style":108},[941],{"type":37,"value":942}," converted\n",{"type":32,"tag":95,"props":944,"children":945},{"class":97,"line":229},[946,951,956,961],{"type":32,"tag":95,"props":947,"children":948},{"style":432},[949],{"type":37,"value":950},"  FROM",{"type":32,"tag":95,"props":952,"children":953},{"style":108},[954],{"type":37,"value":955}," {{ ref(",{"type":32,"tag":95,"props":957,"children":958},{"style":152},[959],{"type":37,"value":960},"'stg_ga4_events'",{"type":32,"tag":95,"props":962,"children":963},{"style":108},[964],{"type":37,"value":632},{"type":32,"tag":95,"props":966,"children":967},{"class":97,"line":26},[968,973],{"type":32,"tag":95,"props":969,"children":970},{"style":432},[971],{"type":37,"value":972},"  GROUP BY",{"type":32,"tag":95,"props":974,"children":975},{"style":108},[976],{"type":37,"value":977}," session_id\n",{"type":32,"tag":95,"props":979,"children":980},{"class":97,"line":267},[981],{"type":32,"tag":95,"props":982,"children":983},{"style":108},[984],{"type":37,"value":985},")\n",{"type":32,"tag":95,"props":987,"children":988},{"class":97,"line":284},[989],{"type":32,"tag":95,"props":990,"children":991},{"style":432},[992],{"type":37,"value":435},{"type":32,"tag":95,"props":994,"children":995},{"class":97,"line":302},[996,1001],{"type":32,"tag":95,"props":997,"children":998},{"style":432},[999],{"type":37,"value":1000},"  *",{"type":32,"tag":95,"props":1002,"children":1003},{"style":108},[1004],{"type":37,"value":572},{"type":32,"tag":95,"props":1006,"children":1007},{"class":97,"line":314},[1008,1013,1018,1022,1026],{"type":32,"tag":95,"props":1009,"children":1010},{"style":108},[1011],{"type":37,"value":1012},"  TIMESTAMP_DIFF(session_end, session_start, ",{"type":32,"tag":95,"props":1014,"children":1015},{"style":432},[1016],{"type":37,"value":1017},"SECOND",{"type":32,"tag":95,"props":1019,"children":1020},{"style":108},[1021],{"type":37,"value":541},{"type":32,"tag":95,"props":1023,"children":1024},{"style":432},[1025],{"type":37,"value":448},{"type":32,"tag":95,"props":1027,"children":1028},{"style":108},[1029],{"type":37,"value":1030}," duration_seconds\n",{"type":32,"tag":95,"props":1032,"children":1033},{"class":97,"line":335},[1034,1038],{"type":32,"tag":95,"props":1035,"children":1036},{"style":432},[1037],{"type":37,"value":607},{"type":32,"tag":95,"props":1039,"children":1040},{"style":108},[1041],{"type":37,"value":1042}," session_events\n",{"type":32,"tag":33,"props":1044,"children":1045},{},[1046,1048,1054,1056,1062,1063,1069,1070,1076,1078,1084,1086,1092,1094,1100],{"type":37,"value":1047},"Mart-Modelle bilden die finale Konsumschicht — BI-Tools, Looker, interne Dashboards schauen hier rein. ",{"type":32,"tag":52,"props":1049,"children":1051},{"className":1050},[],[1052],{"type":37,"value":1053},"fct_marketing_performance.sql",{"type":37,"value":1055}," kombiniert alle Kanäle, berechnet Ausgaben + Umsatz + ROAS. Jedes Mart-Modell konzentriert sich auf eine Business-Entität: ",{"type":32,"tag":52,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":37,"value":1061},"dim_customers",{"type":37,"value":622},{"type":32,"tag":52,"props":1064,"children":1066},{"className":1065},[],[1067],{"type":37,"value":1068},"fct_orders",{"type":37,"value":622},{"type":32,"tag":52,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":37,"value":1075},"fct_sessions",{"type":37,"value":1077},". Die Naming-Konvention ist kritisch — ",{"type":32,"tag":52,"props":1079,"children":1081},{"className":1080},[],[1082],{"type":37,"value":1083},"dim_",{"type":37,"value":1085}," für Dimensionen (Kunde, Produkt), ",{"type":32,"tag":52,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":37,"value":1091},"fct_",{"type":37,"value":1093}," für Fakten (Transaktion, Event), ",{"type":32,"tag":52,"props":1095,"children":1097},{"className":1096},[],[1098],{"type":37,"value":1099},"rpt_",{"type":37,"value":1101}," für Report-Aggregate.",{"type":32,"tag":40,"props":1103,"children":1105},{"id":1104},"semantic-layer-kpi-definitionen-als-code",[1106],{"type":37,"value":1107},"Semantic Layer: KPI-Definitionen als Code",{"type":32,"tag":33,"props":1109,"children":1110},{},[1111,1113,1119],{"type":37,"value":1112},"Die Semantic Layer zieht Metrik-Definitionen in dbt — \"Was ist Revenue?\", \"Wie berechnet sich CAC?\" stehen nicht mehr in Spreadsheets, sondern in YAML. Mit dbt v1.6+ definieren Sie den Metrik-Graph in ",{"type":32,"tag":52,"props":1114,"children":1116},{"className":1115},[],[1117],{"type":37,"value":1118},"metrics.yml",{"type":37,"value":83},{"type":32,"tag":85,"props":1121,"children":1123},{"className":87,"code":1122,"language":89,"meta":16,"style":16},"version: 2\nmetrics:\n  - name: revenue\n    label: Revenue\n    model: ref('fct_orders')\n    calculation_method: sum\n    expression: order_amount\n    timestamp: order_date\n    time_grains: [day, week, month, quarter]\n    dimensions:\n      - channel\n      - country\n      - device_category\n\n  - name: cac\n    label: Customer Acquisition Cost\n    calculation_method: derived\n    expression: \"{{ metric('ad_spend') }} \u002F {{ metric('new_customers') }}\"\n    timestamp: acquisition_date\n    time_grains: [month, quarter]\n",[1124],{"type":32,"tag":52,"props":1125,"children":1126},{"__ignoreMap":16},[1127,1142,1154,1174,1191,1208,1225,1242,1259,1309,1321,1333,1345,1357,1366,1387,1404,1421,1438,1455],{"type":32,"tag":95,"props":1128,"children":1129},{"class":97,"line":98},[1130,1134,1138],{"type":32,"tag":95,"props":1131,"children":1132},{"style":102},[1133],{"type":37,"value":105},{"type":32,"tag":95,"props":1135,"children":1136},{"style":108},[1137],{"type":37,"value":111},{"type":32,"tag":95,"props":1139,"children":1140},{"style":114},[1141],{"type":37,"value":117},{"type":32,"tag":95,"props":1143,"children":1144},{"class":97,"line":120},[1145,1150],{"type":32,"tag":95,"props":1146,"children":1147},{"style":102},[1148],{"type":37,"value":1149},"metrics",{"type":32,"tag":95,"props":1151,"children":1152},{"style":108},[1153],{"type":37,"value":131},{"type":32,"tag":95,"props":1155,"children":1156},{"class":97,"line":134},[1157,1161,1165,1169],{"type":32,"tag":95,"props":1158,"children":1159},{"style":108},[1160],{"type":37,"value":140},{"type":32,"tag":95,"props":1162,"children":1163},{"style":102},[1164],{"type":37,"value":145},{"type":32,"tag":95,"props":1166,"children":1167},{"style":108},[1168],{"type":37,"value":111},{"type":32,"tag":95,"props":1170,"children":1171},{"style":152},[1172],{"type":37,"value":1173},"revenue\n",{"type":32,"tag":95,"props":1175,"children":1176},{"class":97,"line":158},[1177,1182,1186],{"type":32,"tag":95,"props":1178,"children":1179},{"style":102},[1180],{"type":37,"value":1181},"    label",{"type":32,"tag":95,"props":1183,"children":1184},{"style":108},[1185],{"type":37,"value":111},{"type":32,"tag":95,"props":1187,"children":1188},{"style":152},[1189],{"type":37,"value":1190},"Revenue\n",{"type":32,"tag":95,"props":1192,"children":1193},{"class":97,"line":176},[1194,1199,1203],{"type":32,"tag":95,"props":1195,"children":1196},{"style":102},[1197],{"type":37,"value":1198},"    model",{"type":32,"tag":95,"props":1200,"children":1201},{"style":108},[1202],{"type":37,"value":111},{"type":32,"tag":95,"props":1204,"children":1205},{"style":152},[1206],{"type":37,"value":1207},"ref('fct_orders')\n",{"type":32,"tag":95,"props":1209,"children":1210},{"class":97,"line":189},[1211,1216,1220],{"type":32,"tag":95,"props":1212,"children":1213},{"style":102},[1214],{"type":37,"value":1215},"    calculation_method",{"type":32,"tag":95,"props":1217,"children":1218},{"style":108},[1219],{"type":37,"value":111},{"type":32,"tag":95,"props":1221,"children":1222},{"style":152},[1223],{"type":37,"value":1224},"sum\n",{"type":32,"tag":95,"props":1226,"children":1227},{"class":97,"line":211},[1228,1233,1237],{"type":32,"tag":95,"props":1229,"children":1230},{"style":102},[1231],{"type":37,"value":1232},"    expression",{"type":32,"tag":95,"props":1234,"children":1235},{"style":108},[1236],{"type":37,"value":111},{"type":32,"tag":95,"props":1238,"children":1239},{"style":152},[1240],{"type":37,"value":1241},"order_amount\n",{"type":32,"tag":95,"props":1243,"children":1244},{"class":97,"line":229},[1245,1250,1254],{"type":32,"tag":95,"props":1246,"children":1247},{"style":102},[1248],{"type":37,"value":1249},"    timestamp",{"type":32,"tag":95,"props":1251,"children":1252},{"style":108},[1253],{"type":37,"value":111},{"type":32,"tag":95,"props":1255,"children":1256},{"style":152},[1257],{"type":37,"value":1258},"order_date\n",{"type":32,"tag":95,"props":1260,"children":1261},{"class":97,"line":26},[1262,1267,1272,1277,1281,1286,1290,1295,1299,1304],{"type":32,"tag":95,"props":1263,"children":1264},{"style":102},[1265],{"type":37,"value":1266},"    time_grains",{"type":32,"tag":95,"props":1268,"children":1269},{"style":108},[1270],{"type":37,"value":1271},": [",{"type":32,"tag":95,"props":1273,"children":1274},{"style":152},[1275],{"type":37,"value":1276},"day",{"type":32,"tag":95,"props":1278,"children":1279},{"style":108},[1280],{"type":37,"value":622},{"type":32,"tag":95,"props":1282,"children":1283},{"style":152},[1284],{"type":37,"value":1285},"week",{"type":32,"tag":95,"props":1287,"children":1288},{"style":108},[1289],{"type":37,"value":622},{"type":32,"tag":95,"props":1291,"children":1292},{"style":152},[1293],{"type":37,"value":1294},"month",{"type":32,"tag":95,"props":1296,"children":1297},{"style":108},[1298],{"type":37,"value":622},{"type":32,"tag":95,"props":1300,"children":1301},{"style":152},[1302],{"type":37,"value":1303},"quarter",{"type":32,"tag":95,"props":1305,"children":1306},{"style":108},[1307],{"type":37,"value":1308},"]\n",{"type":32,"tag":95,"props":1310,"children":1311},{"class":97,"line":267},[1312,1317],{"type":32,"tag":95,"props":1313,"children":1314},{"style":102},[1315],{"type":37,"value":1316},"    dimensions",{"type":32,"tag":95,"props":1318,"children":1319},{"style":108},[1320],{"type":37,"value":131},{"type":32,"tag":95,"props":1322,"children":1323},{"class":97,"line":284},[1324,1328],{"type":32,"tag":95,"props":1325,"children":1326},{"style":108},[1327],{"type":37,"value":195},{"type":32,"tag":95,"props":1329,"children":1330},{"style":152},[1331],{"type":37,"value":1332},"channel\n",{"type":32,"tag":95,"props":1334,"children":1335},{"class":97,"line":302},[1336,1340],{"type":32,"tag":95,"props":1337,"children":1338},{"style":108},[1339],{"type":37,"value":195},{"type":32,"tag":95,"props":1341,"children":1342},{"style":152},[1343],{"type":37,"value":1344},"country\n",{"type":32,"tag":95,"props":1346,"children":1347},{"class":97,"line":314},[1348,1352],{"type":32,"tag":95,"props":1349,"children":1350},{"style":108},[1351],{"type":37,"value":195},{"type":32,"tag":95,"props":1353,"children":1354},{"style":152},[1355],{"type":37,"value":1356},"device_category\n",{"type":32,"tag":95,"props":1358,"children":1359},{"class":97,"line":335},[1360],{"type":32,"tag":95,"props":1361,"children":1363},{"emptyLinePlaceholder":1362},true,[1364],{"type":37,"value":1365},"\n",{"type":32,"tag":95,"props":1367,"children":1369},{"class":97,"line":1368},15,[1370,1374,1378,1382],{"type":32,"tag":95,"props":1371,"children":1372},{"style":108},[1373],{"type":37,"value":140},{"type":32,"tag":95,"props":1375,"children":1376},{"style":102},[1377],{"type":37,"value":145},{"type":32,"tag":95,"props":1379,"children":1380},{"style":108},[1381],{"type":37,"value":111},{"type":32,"tag":95,"props":1383,"children":1384},{"style":152},[1385],{"type":37,"value":1386},"cac\n",{"type":32,"tag":95,"props":1388,"children":1390},{"class":97,"line":1389},16,[1391,1395,1399],{"type":32,"tag":95,"props":1392,"children":1393},{"style":102},[1394],{"type":37,"value":1181},{"type":32,"tag":95,"props":1396,"children":1397},{"style":108},[1398],{"type":37,"value":111},{"type":32,"tag":95,"props":1400,"children":1401},{"style":152},[1402],{"type":37,"value":1403},"Customer Acquisition Cost\n",{"type":32,"tag":95,"props":1405,"children":1407},{"class":97,"line":1406},17,[1408,1412,1416],{"type":32,"tag":95,"props":1409,"children":1410},{"style":102},[1411],{"type":37,"value":1215},{"type":32,"tag":95,"props":1413,"children":1414},{"style":108},[1415],{"type":37,"value":111},{"type":32,"tag":95,"props":1417,"children":1418},{"style":152},[1419],{"type":37,"value":1420},"derived\n",{"type":32,"tag":95,"props":1422,"children":1424},{"class":97,"line":1423},18,[1425,1429,1433],{"type":32,"tag":95,"props":1426,"children":1427},{"style":102},[1428],{"type":37,"value":1232},{"type":32,"tag":95,"props":1430,"children":1431},{"style":108},[1432],{"type":37,"value":111},{"type":32,"tag":95,"props":1434,"children":1435},{"style":152},[1436],{"type":37,"value":1437},"\"{{ metric('ad_spend') }} \u002F {{ metric('new_customers') }}\"\n",{"type":32,"tag":95,"props":1439,"children":1441},{"class":97,"line":1440},19,[1442,1446,1450],{"type":32,"tag":95,"props":1443,"children":1444},{"style":102},[1445],{"type":37,"value":1249},{"type":32,"tag":95,"props":1447,"children":1448},{"style":108},[1449],{"type":37,"value":111},{"type":32,"tag":95,"props":1451,"children":1452},{"style":152},[1453],{"type":37,"value":1454},"acquisition_date\n",{"type":32,"tag":95,"props":1456,"children":1458},{"class":97,"line":1457},20,[1459,1463,1467,1471,1475,1479],{"type":32,"tag":95,"props":1460,"children":1461},{"style":102},[1462],{"type":37,"value":1266},{"type":32,"tag":95,"props":1464,"children":1465},{"style":108},[1466],{"type":37,"value":1271},{"type":32,"tag":95,"props":1468,"children":1469},{"style":152},[1470],{"type":37,"value":1294},{"type":32,"tag":95,"props":1472,"children":1473},{"style":108},[1474],{"type":37,"value":622},{"type":32,"tag":95,"props":1476,"children":1477},{"style":152},[1478],{"type":37,"value":1303},{"type":32,"tag":95,"props":1480,"children":1481},{"style":108},[1482],{"type":37,"value":1308},{"type":32,"tag":33,"props":1484,"children":1485},{},[1486],{"type":37,"value":1487},"Mit der Semantic Layer berechnet nicht das BI-Tool CAC — dbt berechnet es. Wenn Looker \"gib mir CAC\" fragt, gibt dbt compiled SQL zurück, joined spend- und new-customer-Tabellen und teilt. Da die Definition Code ist, liegt sie in Git-Historie — \"Wer hat CAC-Berechnung geändert, warum?\" ist beantwortbar. Spreadsheet-Formeln gehen nicht verloren, sondern sind versioniert.",{"type":32,"tag":33,"props":1489,"children":1490},{},[1491,1493,1502,1504,1510,1512,1518],{"type":37,"value":1492},"Bei Roibase-Projekten wird die Semantic Layer im Rahmen von ",{"type":32,"tag":1494,"props":1495,"children":1499},"a",{"href":1496,"rel":1497},"https:\u002F\u002Fwww.roibase.com.tr\u002Fde\u002Fverianalizi",[1498],"nofollow",[1500],{"type":37,"value":1501},"Datenanalyse & Insight-Engineering",{"type":37,"value":1503}," aufgebaut — nicht nur Metrik-Definition, sondern auch KPI-Tree-Mapping, Dimension-Hierarchie und Grain-Standardisierung. Beispiel: \"revenue\"-Metrik ist die Summe von ",{"type":32,"tag":52,"props":1505,"children":1507},{"className":1506},[],[1508],{"type":37,"value":1509},"fct_orders.order_amount",{"type":37,"value":1511},", aber \"recognized_revenue\" wird nach ",{"type":32,"tag":52,"props":1513,"children":1515},{"className":1514},[],[1516],{"type":37,"value":1517},"recognized_at",{"type":37,"value":1519},"-Timestamp gefiltert (für SaaS-Subscription-Modelle). Eine Tabelle, zwei Metriken, unterschiedliche Business-Logik.",{"type":32,"tag":40,"props":1521,"children":1523},{"id":1522},"exposures-nachgelagerte-abhängigkeiten-sichtbar-machen",[1524],{"type":37,"value":1525},"Exposures: Nachgelagerte Abhängigkeiten sichtbar machen",{"type":32,"tag":33,"props":1527,"children":1528},{},[1529,1531,1537,1539,1545],{"type":37,"value":1530},"Exposure antwortet dbt auf die Frage \"Wer nutzt dieses Modell?\". Wenn ein Looker-Dashboard auf ",{"type":32,"tag":52,"props":1532,"children":1534},{"className":1533},[],[1535],{"type":37,"value":1536},"fct_marketing_performance",{"type":37,"value":1538}," schaut, definieren Sie das in ",{"type":32,"tag":52,"props":1540,"children":1542},{"className":1541},[],[1543],{"type":37,"value":1544},"exposures.yml",{"type":37,"value":83},{"type":32,"tag":85,"props":1547,"children":1549},{"className":87,"code":1548,"language":89,"meta":16,"style":16},"version: 2\nexposures:\n  - name: marketing_dashboard\n    type: dashboard\n    maturity: high\n    owner:\n      name: Growth Team\n      email: growth@company.com\n    depends_on:\n      - ref('fct_marketing_performance')\n      - ref('dim_customers')\n    description: \"Executive Marketing Dashboard — tägliche Aktualisierung, 90-Tage-Fenster\"\n    url: https:\u002F\u002Flooker.company.com\u002Fdashboards\u002F123\n",[1550],{"type":32,"tag":52,"props":1551,"children":1552},{"__ignoreMap":16},[1553,1568,1580,1600,1617,1634,1646,1663,1680,1692,1704,1716,1733],{"type":32,"tag":95,"props":1554,"children":1555},{"class":97,"line":98},[1556,1560,1564],{"type":32,"tag":95,"props":1557,"children":1558},{"style":102},[1559],{"type":37,"value":105},{"type":32,"tag":95,"props":1561,"children":1562},{"style":108},[1563],{"type":37,"value":111},{"type":32,"tag":95,"props":1565,"children":1566},{"style":114},[1567],{"type":37,"value":117},{"type":32,"tag":95,"props":1569,"children":1570},{"class":97,"line":120},[1571,1576],{"type":32,"tag":95,"props":1572,"children":1573},{"style":102},[1574],{"type":37,"value":1575},"exposures",{"type":32,"tag":95,"props":1577,"children":1578},{"style":108},[1579],{"type":37,"value":131},{"type":32,"tag":95,"props":1581,"children":1582},{"class":97,"line":134},[1583,1587,1591,1595],{"type":32,"tag":95,"props":1584,"children":1585},{"style":108},[1586],{"type":37,"value":140},{"type":32,"tag":95,"props":1588,"children":1589},{"style":102},[1590],{"type":37,"value":145},{"type":32,"tag":95,"props":1592,"children":1593},{"style":108},[1594],{"type":37,"value":111},{"type":32,"tag":95,"props":1596,"children":1597},{"style":152},[1598],{"type":37,"value":1599},"marketing_dashboard\n",{"type":32,"tag":95,"props":1601,"children":1602},{"class":97,"line":158},[1603,1608,1612],{"type":32,"tag":95,"props":1604,"children":1605},{"style":102},[1606],{"type":37,"value":1607},"    type",{"type":32,"tag":95,"props":1609,"children":1610},{"style":108},[1611],{"type":37,"value":111},{"type":32,"tag":95,"props":1613,"children":1614},{"style":152},[1615],{"type":37,"value":1616},"dashboard\n",{"type":32,"tag":95,"props":1618,"children":1619},{"class":97,"line":176},[1620,1625,1629],{"type":32,"tag":95,"props":1621,"children":1622},{"style":102},[1623],{"type":37,"value":1624},"    maturity",{"type":32,"tag":95,"props":1626,"children":1627},{"style":108},[1628],{"type":37,"value":111},{"type":32,"tag":95,"props":1630,"children":1631},{"style":152},[1632],{"type":37,"value":1633},"high\n",{"type":32,"tag":95,"props":1635,"children":1636},{"class":97,"line":189},[1637,1642],{"type":32,"tag":95,"props":1638,"children":1639},{"style":102},[1640],{"type":37,"value":1641},"    owner",{"type":32,"tag":95,"props":1643,"children":1644},{"style":108},[1645],{"type":37,"value":131},{"type":32,"tag":95,"props":1647,"children":1648},{"class":97,"line":211},[1649,1654,1658],{"type":32,"tag":95,"props":1650,"children":1651},{"style":102},[1652],{"type":37,"value":1653},"      name",{"type":32,"tag":95,"props":1655,"children":1656},{"style":108},[1657],{"type":37,"value":111},{"type":32,"tag":95,"props":1659,"children":1660},{"style":152},[1661],{"type":37,"value":1662},"Growth Team\n",{"type":32,"tag":95,"props":1664,"children":1665},{"class":97,"line":229},[1666,1671,1675],{"type":32,"tag":95,"props":1667,"children":1668},{"style":102},[1669],{"type":37,"value":1670},"      email",{"type":32,"tag":95,"props":1672,"children":1673},{"style":108},[1674],{"type":37,"value":111},{"type":32,"tag":95,"props":1676,"children":1677},{"style":152},[1678],{"type":37,"value":1679},"growth@company.com\n",{"type":32,"tag":95,"props":1681,"children":1682},{"class":97,"line":26},[1683,1688],{"type":32,"tag":95,"props":1684,"children":1685},{"style":102},[1686],{"type":37,"value":1687},"    depends_on",{"type":32,"tag":95,"props":1689,"children":1690},{"style":108},[1691],{"type":37,"value":131},{"type":32,"tag":95,"props":1693,"children":1694},{"class":97,"line":267},[1695,1699],{"type":32,"tag":95,"props":1696,"children":1697},{"style":108},[1698],{"type":37,"value":195},{"type":32,"tag":95,"props":1700,"children":1701},{"style":152},[1702],{"type":37,"value":1703},"ref('fct_marketing_performance')\n",{"type":32,"tag":95,"props":1705,"children":1706},{"class":97,"line":284},[1707,1711],{"type":32,"tag":95,"props":1708,"children":1709},{"style":108},[1710],{"type":37,"value":195},{"type":32,"tag":95,"props":1712,"children":1713},{"style":152},[1714],{"type":37,"value":1715},"ref('dim_customers')\n",{"type":32,"tag":95,"props":1717,"children":1718},{"class":97,"line":302},[1719,1724,1728],{"type":32,"tag":95,"props":1720,"children":1721},{"style":102},[1722],{"type":37,"value":1723},"    description",{"type":32,"tag":95,"props":1725,"children":1726},{"style":108},[1727],{"type":37,"value":111},{"type":32,"tag":95,"props":1729,"children":1730},{"style":152},[1731],{"type":37,"value":1732},"\"Executive Marketing Dashboard — tägliche Aktualisierung, 90-Tage-Fenster\"\n",{"type":32,"tag":95,"props":1734,"children":1735},{"class":97,"line":314},[1736,1741,1745],{"type":32,"tag":95,"props":1737,"children":1738},{"style":102},[1739],{"type":37,"value":1740},"    url",{"type":32,"tag":95,"props":1742,"children":1743},{"style":108},[1744],{"type":37,"value":111},{"type":32,"tag":95,"props":1746,"children":1747},{"style":152},[1748],{"type":37,"value":1749},"https:\u002F\u002Flooker.company.com\u002Fdashboards\u002F123\n",{"type":32,"tag":33,"props":1751,"children":1752},{},[1753,1755,1760,1762,1768],{"type":37,"value":1754},"Ohne Exposure-Definition wissen Sie nicht, welches Dashboard bricht, wenn Sie ",{"type":32,"tag":52,"props":1756,"children":1758},{"className":1757},[],[1759],{"type":37,"value":1536},{"type":37,"value":1761}," ändern. Sie deployen, Looker zeigt Null an, Sie debuggen 2 Stunden. Mit Exposure sagt der Befehl ",{"type":32,"tag":52,"props":1763,"children":1765},{"className":1764},[],[1766],{"type":37,"value":1767},"dbt compile --select +exposure:marketing_dashboard",{"type":37,"value":1769}," welche upstream Modelle betroffen sind — Impact-Analyse vor der Änderung.",{"type":32,"tag":33,"props":1771,"children":1772},{},[1773,1775,1781],{"type":37,"value":1774},"Exposure ist nicht nur BI-Tools — auch Reverse-ETL (Hightouch, Census) ist eine Exposure. Wenn Sie ",{"type":32,"tag":52,"props":1776,"children":1778},{"className":1777},[],[1779],{"type":37,"value":1780},"customers",{"type":37,"value":1782},"-Tabelle zu Meta CAPI synchen:",{"type":32,"tag":85,"props":1784,"children":1786},{"className":87,"code":1785,"language":89,"meta":16,"style":16},"exposures:\n  - name: meta_capi_sync\n    type: application\n    maturity: high\n    depends_on:\n      - ref('dim_customers')\n    description: \"Meta Conversion API — inkrementelle Customer-Events, 5-Minuten-Verzögerung\"\n",[1787],{"type":32,"tag":52,"props":1788,"children":1789},{"__ignoreMap":16},[1790,1801,1821,1837,1852,1863,1874],{"type":32,"tag":95,"props":1791,"children":1792},{"class":97,"line":98},[1793,1797],{"type":32,"tag":95,"props":1794,"children":1795},{"style":102},[1796],{"type":37,"value":1575},{"type":32,"tag":95,"props":1798,"children":1799},{"style":108},[1800],{"type":37,"value":131},{"type":32,"tag":95,"props":1802,"children":1803},{"class":97,"line":120},[1804,1808,1812,1816],{"type":32,"tag":95,"props":1805,"children":1806},{"style":108},[1807],{"type":37,"value":140},{"type":32,"tag":95,"props":1809,"children":1810},{"style":102},[1811],{"type":37,"value":145},{"type":32,"tag":95,"props":1813,"children":1814},{"style":108},[1815],{"type":37,"value":111},{"type":32,"tag":95,"props":1817,"children":1818},{"style":152},[1819],{"type":37,"value":1820},"meta_capi_sync\n",{"type":32,"tag":95,"props":1822,"children":1823},{"class":97,"line":134},[1824,1828,1832],{"type":32,"tag":95,"props":1825,"children":1826},{"style":102},[1827],{"type":37,"value":1607},{"type":32,"tag":95,"props":1829,"children":1830},{"style":108},[1831],{"type":37,"value":111},{"type":32,"tag":95,"props":1833,"children":1834},{"style":152},[1835],{"type":37,"value":1836},"application\n",{"type":32,"tag":95,"props":1838,"children":1839},{"class":97,"line":158},[1840,1844,1848],{"type":32,"tag":95,"props":1841,"children":1842},{"style":102},[1843],{"type":37,"value":1624},{"type":32,"tag":95,"props":1845,"children":1846},{"style":108},[1847],{"type":37,"value":111},{"type":32,"tag":95,"props":1849,"children":1850},{"style":152},[1851],{"type":37,"value":1633},{"type":32,"tag":95,"props":1853,"children":1854},{"class":97,"line":176},[1855,1859],{"type":32,"tag":95,"props":1856,"children":1857},{"style":102},[1858],{"type":37,"value":1687},{"type":32,"tag":95,"props":1860,"children":1861},{"style":108},[1862],{"type":37,"value":131},{"type":32,"tag":95,"props":1864,"children":1865},{"class":97,"line":189},[1866,1870],{"type":32,"tag":95,"props":1867,"children":1868},{"style":108},[1869],{"type":37,"value":195},{"type":32,"tag":95,"props":1871,"children":1872},{"style":152},[1873],{"type":37,"value":1715},{"type":32,"tag":95,"props":1875,"children":1876},{"class":97,"line":211},[1877,1881,1885],{"type":32,"tag":95,"props":1878,"children":1879},{"style":102},[1880],{"type":37,"value":1723},{"type":32,"tag":95,"props":1882,"children":1883},{"style":108},[1884],{"type":37,"value":111},{"type":32,"tag":95,"props":1886,"children":1887},{"style":152},[1888],{"type":37,"value":1889},"\"Meta Conversion API — inkrementelle Customer-Events, 5-Minuten-Verzögerung\"\n",{"type":32,"tag":33,"props":1891,"children":1892},{},[1893],{"type":37,"value":1894},"Diese Definition warnt \"Wenn du dim_customers änderst, bricht das Schema, das zu CAPI geht\" — frühe Alarmfunktion gegen production incidents.",{"type":32,"tag":40,"props":1896,"children":1898},{"id":1897},"production-pipeline-incremental-builds-und-test-coverage",[1899],{"type":37,"value":1900},"Production Pipeline: Incremental Builds und Test Coverage",{"type":32,"tag":33,"props":1902,"children":1903},{},[1904,1906,1912],{"type":37,"value":1905},"dbt führt in production nicht täglich Full Refresh durch — inkrementelle Modelle nutzen. ",{"type":32,"tag":52,"props":1907,"children":1909},{"className":1908},[],[1910],{"type":37,"value":1911},"fct_orders.sql",{"type":37,"value":1913}," verarbeitet nur die letzten 3 Tage neu:",{"type":32,"tag":85,"props":1915,"children":1917},{"className":420,"code":1916,"language":422,"meta":16,"style":16},"{{ config(\n    materialized='incremental',\n    unique_key='order_id',\n    partition_by={'field': 'order_date', 'data_type': 'date'},\n    cluster_by=['customer_id', 'channel']\n) }}\n\nSELECT\n  order_id,\n  customer_id,\n  order_date,\n  order_amount,\n  channel\nFROM {{ ref('stg_shopify_orders') }}\n\n{% if is_incremental() %}\nWHERE order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 3 DAY)\n{% endif %}\n",[1918],{"type":32,"tag":52,"props":1919,"children":1920},{"__ignoreMap":16},[1921,1929,1950,1971,2025,2042,2049,2056,2063,2071,2079,2087,2095,2103,2123,2130,2148,2183],{"type":32,"tag":95,"props":1922,"children":1923},{"class":97,"line":98},[1924],{"type":32,"tag":95,"props":1925,"children":1926},{"style":108},[1927],{"type":37,"value":1928},"{{ config(\n",{"type":32,"tag":95,"props":1930,"children":1931},{"class":97,"line":120},[1932,1937,1941,1946],{"type":32,"tag":95,"props":1933,"children":1934},{"style":108},[1935],{"type":37,"value":1936},"    materialized",{"type":32,"tag":95,"props":1938,"children":1939},{"style":432},[1940],{"type":37,"value":839},{"type":32,"tag":95,"props":1942,"children":1943},{"style":152},[1944],{"type":37,"value":1945},"'incremental'",{"type":32,"tag":95,"props":1947,"children":1948},{"style":108},[1949],{"type":37,"value":572},{"type":32,"tag":95,"props":1951,"children":1952},{"class":97,"line":134},[1953,1958,1962,1967],{"type":32,"tag":95,"props":1954,"children":1955},{"style":108},[1956],{"type":37,"value":1957},"    unique_key",{"type":32,"tag":95,"props":1959,"children":1960},{"style":432},[1961],{"type":37,"value":839},{"type":32,"tag":95,"props":1963,"children":1964},{"style":152},[1965],{"type":37,"value":1966},"'order_id'",{"type":32,"tag":95,"props":1968,"children":1969},{"style":108},[1970],{"type":37,"value":572},{"type":32,"tag":95,"props":1972,"children":1973},{"class":97,"line":158},[1974,1979,1983,1988,1993,1997,2002,2006,2011,2015,2020],{"type":32,"tag":95,"props":1975,"children":1976},{"style":108},[1977],{"type":37,"value":1978},"    partition_by",{"type":32,"tag":95,"props":1980,"children":1981},{"style":432},[1982],{"type":37,"value":839},{"type":32,"tag":95,"props":1984,"children":1985},{"style":108},[1986],{"type":37,"value":1987},"{",{"type":32,"tag":95,"props":1989,"children":1990},{"style":152},[1991],{"type":37,"value":1992},"'field'",{"type":32,"tag":95,"props":1994,"children":1995},{"style":108},[1996],{"type":37,"value":111},{"type":32,"tag":95,"props":1998,"children":1999},{"style":152},[2000],{"type":37,"value":2001},"'order_date'",{"type":32,"tag":95,"props":2003,"children":2004},{"style":108},[2005],{"type":37,"value":622},{"type":32,"tag":95,"props":2007,"children":2008},{"style":152},[2009],{"type":37,"value":2010},"'data_type'",{"type":32,"tag":95,"props":2012,"children":2013},{"style":108},[2014],{"type":37,"value":111},{"type":32,"tag":95,"props":2016,"children":2017},{"style":152},[2018],{"type":37,"value":2019},"'date'",{"type":32,"tag":95,"props":2021,"children":2022},{"style":108},[2023],{"type":37,"value":2024},"},\n",{"type":32,"tag":95,"props":2026,"children":2027},{"class":97,"line":176},[2028,2033,2037],{"type":32,"tag":95,"props":2029,"children":2030},{"style":108},[2031],{"type":37,"value":2032},"    cluster_by",{"type":32,"tag":95,"props":2034,"children":2035},{"style":432},[2036],{"type":37,"value":839},{"type":32,"tag":95,"props":2038,"children":2039},{"style":108},[2040],{"type":37,"value":2041},"['customer_id', 'channel']\n",{"type":32,"tag":95,"props":2043,"children":2044},{"class":97,"line":189},[2045],{"type":32,"tag":95,"props":2046,"children":2047},{"style":108},[2048],{"type":37,"value":632},{"type":32,"tag":95,"props":2050,"children":2051},{"class":97,"line":211},[2052],{"type":32,"tag":95,"props":2053,"children":2054},{"emptyLinePlaceholder":1362},[2055],{"type":37,"value":1365},{"type":32,"tag":95,"props":2057,"children":2058},{"class":97,"line":229},[2059],{"type":32,"tag":95,"props":2060,"children":2061},{"style":432},[2062],{"type":37,"value":435},{"type":32,"tag":95,"props":2064,"children":2065},{"class":97,"line":26},[2066],{"type":32,"tag":95,"props":2067,"children":2068},{"style":108},[2069],{"type":37,"value":2070},"  order_id,\n",{"type":32,"tag":95,"props":2072,"children":2073},{"class":97,"line":267},[2074],{"type":32,"tag":95,"props":2075,"children":2076},{"style":108},[2077],{"type":37,"value":2078},"  customer_id,\n",{"type":32,"tag":95,"props":2080,"children":2081},{"class":97,"line":284},[2082],{"type":32,"tag":95,"props":2083,"children":2084},{"style":108},[2085],{"type":37,"value":2086},"  order_date,\n",{"type":32,"tag":95,"props":2088,"children":2089},{"class":97,"line":302},[2090],{"type":32,"tag":95,"props":2091,"children":2092},{"style":108},[2093],{"type":37,"value":2094},"  order_amount,\n",{"type":32,"tag":95,"props":2096,"children":2097},{"class":97,"line":314},[2098],{"type":32,"tag":95,"props":2099,"children":2100},{"style":108},[2101],{"type":37,"value":2102},"  channel\n",{"type":32,"tag":95,"props":2104,"children":2105},{"class":97,"line":335},[2106,2110,2114,2119],{"type":32,"tag":95,"props":2107,"children":2108},{"style":432},[2109],{"type":37,"value":607},{"type":32,"tag":95,"props":2111,"children":2112},{"style":108},[2113],{"type":37,"value":955},{"type":32,"tag":95,"props":2115,"children":2116},{"style":152},[2117],{"type":37,"value":2118},"'stg_shopify_orders'",{"type":32,"tag":95,"props":2120,"children":2121},{"style":108},[2122],{"type":37,"value":632},{"type":32,"tag":95,"props":2124,"children":2125},{"class":97,"line":1368},[2126],{"type":32,"tag":95,"props":2127,"children":2128},{"emptyLinePlaceholder":1362},[2129],{"type":37,"value":1365},{"type":32,"tag":95,"props":2131,"children":2132},{"class":97,"line":1389},[2133,2138,2143],{"type":32,"tag":95,"props":2134,"children":2135},{"style":108},[2136],{"type":37,"value":2137},"{% ",{"type":32,"tag":95,"props":2139,"children":2140},{"style":432},[2141],{"type":37,"value":2142},"if",{"type":32,"tag":95,"props":2144,"children":2145},{"style":108},[2146],{"type":37,"value":2147}," is_incremental() %}\n",{"type":32,"tag":95,"props":2149,"children":2150},{"class":97,"line":1406},[2151,2155,2160,2165,2170,2175,2179],{"type":32,"tag":95,"props":2152,"children":2153},{"style":432},[2154],{"type":37,"value":521},{"type":32,"tag":95,"props":2156,"children":2157},{"style":108},[2158],{"type":37,"value":2159}," order_date ",{"type":32,"tag":95,"props":2161,"children":2162},{"style":432},[2163],{"type":37,"value":2164},">=",{"type":32,"tag":95,"props":2166,"children":2167},{"style":108},[2168],{"type":37,"value":2169}," DATE_SUB(CURRENT_DATE(), INTERVAL ",{"type":32,"tag":95,"props":2171,"children":2172},{"style":114},[2173],{"type":37,"value":2174},"3",{"type":32,"tag":95,"props":2176,"children":2177},{"style":432},[2178],{"type":37,"value":674},{"type":32,"tag":95,"props":2180,"children":2181},{"style":108},[2182],{"type":37,"value":985},{"type":32,"tag":95,"props":2184,"children":2185},{"class":97,"line":1423},[2186],{"type":32,"tag":95,"props":2187,"children":2188},{"style":108},[2189],{"type":37,"value":2190},"{% endif %}\n",{"type":32,"tag":33,"props":2192,"children":2193},{},[2194,2196,2202],{"type":37,"value":2195},"Incremental Builds senken BigQuery-Kosten um 90% — statt 2TB-Scan für die ganze Tabelle nur 50GB für 3 Tage. Partitionierung + Clustering verbessern Query-Performance: ",{"type":32,"tag":52,"props":2197,"children":2199},{"className":2198},[],[2200],{"type":37,"value":2201},"WHERE customer_id = 'X'",{"type":37,"value":2203}," scannt nur den relevanten Cluster, kein Full Table Scan.",{"type":32,"tag":33,"props":2205,"children":2206},{},[2207,2209,2215],{"type":37,"value":2208},"Test Coverage ist kritisch. Sie schreiben Tests für jedes Modell in ",{"type":32,"tag":52,"props":2210,"children":2212},{"className":2211},[],[2213],{"type":37,"value":2214},"schema.yml",{"type":37,"value":83},{"type":32,"tag":85,"props":2217,"children":2219},{"className":87,"code":2218,"language":89,"meta":16,"style":16},"models:\n  - name: fct_orders\n    columns:\n      - name: order_id\n        tests:\n          - unique\n          - not_null\n      - name: order_amount\n        tests:\n          - not_null\n          - dbt_utils.expression_is_true:\n              expression: \">= 0\"\n      - name: order_date\n        tests:\n          - dbt_utils.recency:\n              datepart: day\n              interval: 7\n",[2220],{"type":32,"tag":52,"props":2221,"children":2222},{"__ignoreMap":16},[2223,2235,2255,2267,2287,2299,2312,2324,2343,2354,2365,2381,2398,2417,2428,2444,2461],{"type":32,"tag":95,"props":2224,"children":2225},{"class":97,"line":98},[2226,2231],{"type":32,"tag":95,"props":2227,"children":2228},{"style":102},[2229],{"type":37,"value":2230},"models",{"type":32,"tag":95,"props":2232,"children":2233},{"style":108},[2234],{"type":37,"value":131},{"type":32,"tag":95,"props":2236,"children":2237},{"class":97,"line":120},[2238,2242,2246,2250],{"type":32,"tag":95,"props":2239,"children":2240},{"style":108},[2241],{"type":37,"value":140},{"type":32,"tag":95,"props":2243,"children":2244},{"style":102},[2245],{"type":37,"value":145},{"type":32,"tag":95,"props":2247,"children":2248},{"style":108},[2249],{"type":37,"value":111},{"type":32,"tag":95,"props":2251,"children":2252},{"style":152},[2253],{"type":37,"value":2254},"fct_orders\n",{"type":32,"tag":95,"props":2256,"children":2257},{"class":97,"line":134},[2258,2263],{"type":32,"tag":95,"props":2259,"children":2260},{"style":102},[2261],{"type":37,"value":2262},"    columns",{"type":32,"tag":95,"props":2264,"children":2265},{"style":108},[2266],{"type":37,"value":131},{"type":32,"tag":95,"props":2268,"children":2269},{"class":97,"line":158},[2270,2274,2278,2282],{"type":32,"tag":95,"props":2271,"children":2272},{"style":108},[2273],{"type":37,"value":195},{"type":32,"tag":95,"props":2275,"children":2276},{"style":102},[2277],{"type":37,"value":145},{"type":32,"tag":95,"props":2279,"children":2280},{"style":108},[2281],{"type":37,"value":111},{"type":32,"tag":95,"props":2283,"children":2284},{"style":152},[2285],{"type":37,"value":2286},"order_id\n",{"type":32,"tag":95,"props":2288,"children":2289},{"class":97,"line":176},[2290,2295],{"type":32,"tag":95,"props":2291,"children":2292},{"style":102},[2293],{"type":37,"value":2294},"        tests",{"type":32,"tag":95,"props":2296,"children":2297},{"style":108},[2298],{"type":37,"value":131},{"type":32,"tag":95,"props":2300,"children":2301},{"class":97,"line":189},[2302,2307],{"type":32,"tag":95,"props":2303,"children":2304},{"style":108},[2305],{"type":37,"value":2306},"          - ",{"type":32,"tag":95,"props":2308,"children":2309},{"style":152},[2310],{"type":37,"value":2311},"unique\n",{"type":32,"tag":95,"props":2313,"children":2314},{"class":97,"line":211},[2315,2319],{"type":32,"tag":95,"props":2316,"children":2317},{"style":108},[2318],{"type":37,"value":2306},{"type":32,"tag":95,"props":2320,"children":2321},{"style":152},[2322],{"type":37,"value":2323},"not_null\n",{"type":32,"tag":95,"props":2325,"children":2326},{"class":97,"line":229},[2327,2331,2335,2339],{"type":32,"tag":95,"props":2328,"children":2329},{"style":108},[2330],{"type":37,"value":195},{"type":32,"tag":95,"props":2332,"children":2333},{"style":102},[2334],{"type":37,"value":145},{"type":32,"tag":95,"props":2336,"children":2337},{"style":108},[2338],{"type":37,"value":111},{"type":32,"tag":95,"props":2340,"children":2341},{"style":152},[2342],{"type":37,"value":1241},{"type":32,"tag":95,"props":2344,"children":2345},{"class":97,"line":26},[2346,2350],{"type":32,"tag":95,"props":2347,"children":2348},{"style":102},[2349],{"type":37,"value":2294},{"type":32,"tag":95,"props":2351,"children":2352},{"style":108},[2353],{"type":37,"value":131},{"type":32,"tag":95,"props":2355,"children":2356},{"class":97,"line":267},[2357,2361],{"type":32,"tag":95,"props":2358,"children":2359},{"style":108},[2360],{"type":37,"value":2306},{"type":32,"tag":95,"props":2362,"children":2363},{"style":152},[2364],{"type":37,"value":2323},{"type":32,"tag":95,"props":2366,"children":2367},{"class":97,"line":284},[2368,2372,2377],{"type":32,"tag":95,"props":2369,"children":2370},{"style":108},[2371],{"type":37,"value":2306},{"type":32,"tag":95,"props":2373,"children":2374},{"style":102},[2375],{"type":37,"value":2376},"dbt_utils.expression_is_true",{"type":32,"tag":95,"props":2378,"children":2379},{"style":108},[2380],{"type":37,"value":131},{"type":32,"tag":95,"props":2382,"children":2383},{"class":97,"line":302},[2384,2389,2393],{"type":32,"tag":95,"props":2385,"children":2386},{"style":102},[2387],{"type":37,"value":2388},"              expression",{"type":32,"tag":95,"props":2390,"children":2391},{"style":108},[2392],{"type":37,"value":111},{"type":32,"tag":95,"props":2394,"children":2395},{"style":152},[2396],{"type":37,"value":2397},"\">= 0\"\n",{"type":32,"tag":95,"props":2399,"children":2400},{"class":97,"line":314},[2401,2405,2409,2413],{"type":32,"tag":95,"props":2402,"children":2403},{"style":108},[2404],{"type":37,"value":195},{"type":32,"tag":95,"props":2406,"children":2407},{"style":102},[2408],{"type":37,"value":145},{"type":32,"tag":95,"props":2410,"children":2411},{"style":108},[2412],{"type":37,"value":111},{"type":32,"tag":95,"props":2414,"children":2415},{"style":152},[2416],{"type":37,"value":1258},{"type":32,"tag":95,"props":2418,"children":2419},{"class":97,"line":335},[2420,2424],{"type":32,"tag":95,"props":2421,"children":2422},{"style":102},[2423],{"type":37,"value":2294},{"type":32,"tag":95,"props":2425,"children":2426},{"style":108},[2427],{"type":37,"value":131},{"type":32,"tag":95,"props":2429,"children":2430},{"class":97,"line":1368},[2431,2435,2440],{"type":32,"tag":95,"props":2432,"children":2433},{"style":108},[2434],{"type":37,"value":2306},{"type":32,"tag":95,"props":2436,"children":2437},{"style":102},[2438],{"type":37,"value":2439},"dbt_utils.recency",{"type":32,"tag":95,"props":2441,"children":2442},{"style":108},[2443],{"type":37,"value":131},{"type":32,"tag":95,"props":2445,"children":2446},{"class":97,"line":1389},[2447,2452,2456],{"type":32,"tag":95,"props":2448,"children":2449},{"style":102},[2450],{"type":37,"value":2451},"              datepart",{"type":32,"tag":95,"props":2453,"children":2454},{"style":108},[2455],{"type":37,"value":111},{"type":32,"tag":95,"props":2457,"children":2458},{"style":152},[2459],{"type":37,"value":2460},"day\n",{"type":32,"tag":95,"props":2462,"children":2463},{"class":97,"line":1406},[2464,2469,2473],{"type":32,"tag":95,"props":2465,"children":2466},{"style":102},[2467],{"type":37,"value":2468},"              interval",{"type":32,"tag":95,"props":2470,"children":2471},{"style":108},[2472],{"type":37,"value":111},{"type":32,"tag":95,"props":2474,"children":2475},{"style":114},[2476],{"type":37,"value":2477},"7\n",{"type":32,"tag":33,"props":2479,"children":2480},{},[2481,2483,2489,2491,2497],{"type":37,"value":2482},"Der Befehl ",{"type":32,"tag":52,"props":2484,"children":2486},{"className":2485},[],[2487],{"type":37,"value":2488},"dbt test",{"type":37,"value":2490}," setzt diese Bedingungen in BigQuery durch — wenn order_amount negativ ist, fällt der Build. In production testet jeder Commit in der CI\u002FCD-Pipeline: ",{"type":32,"tag":52,"props":2492,"children":2494},{"className":2493},[],[2495],{"type":37,"value":2496},"dbt run --select state:modified+ → dbt test --select state:modified+",{"type":37,"value":2498},". Modified Modelle + downstream-Abhängigkeiten laufen, Tests folgen, bei Erfolg ist Merge erlaubt.",{"type":32,"tag":40,"props":2500,"children":2502},{"id":2501},"orchestrierung-airflow-prefect-dbt-cloud",[2503],{"type":37,"value":2504},"Orchestrierung: Airflow, Prefect, dbt Cloud",{"type":32,"tag":33,"props":2506,"children":2507},{},[2508],{"type":37,"value":2509},"dbt ist selbst kein Orchestrator — wird von Airflow oder Prefect gesteuert. Beispiel Airflow DAG:",{"type":32,"tag":85,"props":2511,"children":2515},{"className":2512,"code":2513,"language":2514,"meta":16,"style":16},"language-python shiki shiki-themes github-dark","from airflow.providers.google.cloud.operators.bigquery import BigQueryInsertJobOperator\nfrom airflow.operators.bash import BashOperator\n\ndbt_run = BashOperator(\n    task_id='dbt_run',\n    bash_command='cd \u002Fopt\u002Fdbt && dbt run --profiles-dir .',\n    dag=dag\n)\n\ndbt_test = BashOperator(\n    task_id='dbt_test',\n    bash_command='cd \u002Fopt\u002Fdbt && dbt test',\n    dag=dag\n)\n\ndbt_run >> dbt_test\n","python",[2516],{"type":32,"tag":52,"props":2517,"children":2518},{"__ignoreMap":16},[2519,2542,2563,2570,2587,2609,2630,2647,2654,2661,2677,2697,2717,2732,2739,2746],{"type":32,"tag":95,"props":2520,"children":2521},{"class":97,"line":98},[2522,2527,2532,2537],{"type":32,"tag":95,"props":2523,"children":2524},{"style":432},[2525],{"type":37,"value":2526},"from",{"type":32,"tag":95,"props":2528,"children":2529},{"style":108},[2530],{"type":37,"value":2531}," airflow.providers.google.cloud.operators.bigquery ",{"type":32,"tag":95,"props":2533,"children":2534},{"style":432},[2535],{"type":37,"value":2536},"import",{"type":32,"tag":95,"props":2538,"children":2539},{"style":108},[2540],{"type":37,"value":2541}," BigQueryInsertJobOperator\n",{"type":32,"tag":95,"props":2543,"children":2544},{"class":97,"line":120},[2545,2549,2554,2558],{"type":32,"tag":95,"props":2546,"children":2547},{"style":432},[2548],{"type":37,"value":2526},{"type":32,"tag":95,"props":2550,"children":2551},{"style":108},[2552],{"type":37,"value":2553}," airflow.operators.bash ",{"type":32,"tag":95,"props":2555,"children":2556},{"style":432},[2557],{"type":37,"value":2536},{"type":32,"tag":95,"props":2559,"children":2560},{"style":108},[2561],{"type":37,"value":2562}," BashOperator\n",{"type":32,"tag":95,"props":2564,"children":2565},{"class":97,"line":134},[2566],{"type":32,"tag":95,"props":2567,"children":2568},{"emptyLinePlaceholder":1362},[2569],{"type":37,"value":1365},{"type":32,"tag":95,"props":2571,"children":2572},{"class":97,"line":158},[2573,2578,2582],{"type":32,"tag":95,"props":2574,"children":2575},{"style":108},[2576],{"type":37,"value":2577},"dbt_run ",{"type":32,"tag":95,"props":2579,"children":2580},{"style":432},[2581],{"type":37,"value":839},{"type":32,"tag":95,"props":2583,"children":2584},{"style":108},[2585],{"type":37,"value":2586}," BashOperator(\n",{"type":32,"tag":95,"props":2588,"children":2589},{"class":97,"line":176},[2590,2596,2600,2605],{"type":32,"tag":95,"props":2591,"children":2593},{"style":2592},"--shiki-default:#FFAB70",[2594],{"type":37,"value":2595},"    task_id",{"type":32,"tag":95,"props":2597,"children":2598},{"style":432},[2599],{"type":37,"value":839},{"type":32,"tag":95,"props":2601,"children":2602},{"style":152},[2603],{"type":37,"value":2604},"'dbt_run'",{"type":32,"tag":95,"props":2606,"children":2607},{"style":108},[2608],{"type":37,"value":572},{"type":32,"tag":95,"props":2610,"children":2611},{"class":97,"line":189},[2612,2617,2621,2626],{"type":32,"tag":95,"props":2613,"children":2614},{"style":2592},[2615],{"type":37,"value":2616},"    bash_command",{"type":32,"tag":95,"props":2618,"children":2619},{"style":432},[2620],{"type":37,"value":839},{"type":32,"tag":95,"props":2622,"children":2623},{"style":152},[2624],{"type":37,"value":2625},"'cd \u002Fopt\u002Fdbt && dbt run --profiles-dir .'",{"type":32,"tag":95,"props":2627,"children":2628},{"style":108},[2629],{"type":37,"value":572},{"type":32,"tag":95,"props":2631,"children":2632},{"class":97,"line":211},[2633,2638,2642],{"type":32,"tag":95,"props":2634,"children":2635},{"style":2592},[2636],{"type":37,"value":2637},"    dag",{"type":32,"tag":95,"props":2639,"children":2640},{"style":432},[2641],{"type":37,"value":839},{"type":32,"tag":95,"props":2643,"children":2644},{"style":108},[2645],{"type":37,"value":2646},"dag\n",{"type":32,"tag":95,"props":2648,"children":2649},{"class":97,"line":229},[2650],{"type":32,"tag":95,"props":2651,"children":2652},{"style":108},[2653],{"type":37,"value":985},{"type":32,"tag":95,"props":2655,"children":2656},{"class":97,"line":26},[2657],{"type":32,"tag":95,"props":2658,"children":2659},{"emptyLinePlaceholder":1362},[2660],{"type":37,"value":1365},{"type":32,"tag":95,"props":2662,"children":2663},{"class":97,"line":267},[2664,2669,2673],{"type":32,"tag":95,"props":2665,"children":2666},{"style":108},[2667],{"type":37,"value":2668},"dbt_test ",{"type":32,"tag":95,"props":2670,"children":2671},{"style":432},[2672],{"type":37,"value":839},{"type":32,"tag":95,"props":2674,"children":2675},{"style":108},[2676],{"type":37,"value":2586},{"type":32,"tag":95,"props":2678,"children":2679},{"class":97,"line":284},[2680,2684,2688,2693],{"type":32,"tag":95,"props":2681,"children":2682},{"style":2592},[2683],{"type":37,"value":2595},{"type":32,"tag":95,"props":2685,"children":2686},{"style":432},[2687],{"type":37,"value":839},{"type":32,"tag":95,"props":2689,"children":2690},{"style":152},[2691],{"type":37,"value":2692},"'dbt_test'",{"type":32,"tag":95,"props":2694,"children":2695},{"style":108},[2696],{"type":37,"value":572},{"type":32,"tag":95,"props":2698,"children":2699},{"class":97,"line":302},[2700,2704,2708,2713],{"type":32,"tag":95,"props":2701,"children":2702},{"style":2592},[2703],{"type":37,"value":2616},{"type":32,"tag":95,"props":2705,"children":2706},{"style":432},[2707],{"type":37,"value":839},{"type":32,"tag":95,"props":2709,"children":2710},{"style":152},[2711],{"type":37,"value":2712},"'cd \u002Fopt\u002Fdbt && dbt test'",{"type":32,"tag":95,"props":2714,"children":2715},{"style":108},[2716],{"type":37,"value":572},{"type":32,"tag":95,"props":2718,"children":2719},{"class":97,"line":314},[2720,2724,2728],{"type":32,"tag":95,"props":2721,"children":2722},{"style":2592},[2723],{"type":37,"value":2637},{"type":32,"tag":95,"props":2725,"children":2726},{"style":432},[2727],{"type":37,"value":839},{"type":32,"tag":95,"props":2729,"children":2730},{"style":108},[2731],{"type":37,"value":2646},{"type":32,"tag":95,"props":2733,"children":2734},{"class":97,"line":335},[2735],{"type":32,"tag":95,"props":2736,"children":2737},{"style":108},[2738],{"type":37,"value":985},{"type":32,"tag":95,"props":2740,"children":2741},{"class":97,"line":1368},[2742],{"type":32,"tag":95,"props":2743,"children":2744},{"emptyLinePlaceholder":1362},[2745],{"type":37,"value":1365},{"type":32,"tag":95,"props":2747,"children":2748},{"class":97,"line":1389},[2749,2753,2758],{"type":32,"tag":95,"props":2750,"children":2751},{"style":108},[2752],{"type":37,"value":2577},{"type":32,"tag":95,"props":2754,"children":2755},{"style":432},[2756],{"type":37,"value":2757},">>",{"type":32,"tag":95,"props":2759,"children":2760},{"style":108},[2761],{"type":37,"value":2762}," dbt_test\n",{"type":32,"tag":33,"props":2764,"children":2765},{},[2766],{"type":37,"value":2767},"dbt Cloud ist Alternative — managed Orchestration, Web IDE, Slack Alerts. Aber die meisten Enterprise-Teams bevorzugen Airflow, weil neben dbt noch andere Tasks anfallen: upstream API Pull, downstream Reverse-ETL, Snapshot-Tabellen.",{"type":32,"tag":33,"props":2769,"children":2770},{},[2771,2773,2779,2781,2787],{"type":37,"value":2772},"Schedule-Strategie hängt von Data Freshness ab. GA4 Event ist 24 Stunden verzögert (processing_date ≠ event_date), Meta Ads Insights API nicht real-time. Staging-Modelle triggern nach Source Freshness — wenn GA4 neue Partition kommt, refresht ",{"type":32,"tag":52,"props":2774,"children":2776},{"className":2775},[],[2777],{"type":37,"value":2778},"stg_ga4_events",{"type":37,"value":2780},", die Welle läuft zu Intermediate → Mart. Airflow Sensor prüft BigQuery ",{"type":32,"tag":52,"props":2782,"children":2784},{"className":2783},[],[2785],{"type":37,"value":2786},"_TABLE_SUFFIX",{"type":37,"value":83},{"type":32,"tag":85,"props":2789,"children":2791},{"className":2512,"code":2790,"language":2514,"meta":16,"style":16},"wait_for_ga4 = BigQueryTableExistenceSensor(\n    task_id='wait_for_ga4_partition',\n    project_id='analytics_123456',\n    dataset_id='events_',\n    table_id=f\"events_{yesterday.strftime('%Y%m%d')}\",\n    poke_interval=300\n)\n",[2792],{"type":32,"tag":52,"props":2793,"children":2794},{"__ignoreMap":16},[2795,2812,2832,2853,2873,2938,2955],{"type":32,"tag":95,"props":2796,"children":2797},{"class":97,"line":98},[2798,2803,2807],{"type":32,"tag":95,"props":2799,"children":2800},{"style":108},[2801],{"type":37,"value":2802},"wait_for_ga4 ",{"type":32,"tag":95,"props":2804,"children":2805},{"style":432},[2806],{"type":37,"value":839},{"type":32,"tag":95,"props":2808,"children":2809},{"style":108},[2810],{"type":37,"value":2811}," BigQueryTableExistenceSensor(\n",{"type":32,"tag":95,"props":2813,"children":2814},{"class":97,"line":120},[2815,2819,2823,2828],{"type":32,"tag":95,"props":2816,"children":2817},{"style":2592},[2818],{"type":37,"value":2595},{"type":32,"tag":95,"props":2820,"children":2821},{"style":432},[2822],{"type":37,"value":839},{"type":32,"tag":95,"props":2824,"children":2825},{"style":152},[2826],{"type":37,"value":2827},"'wait_for_ga4_partition'",{"type":32,"tag":95,"props":2829,"children":2830},{"style":108},[2831],{"type":37,"value":572},{"type":32,"tag":95,"props":2833,"children":2834},{"class":97,"line":134},[2835,2840,2844,2849],{"type":32,"tag":95,"props":2836,"children":2837},{"style":2592},[2838],{"type":37,"value":2839},"    project_id",{"type":32,"tag":95,"props":2841,"children":2842},{"style":432},[2843],{"type":37,"value":839},{"type":32,"tag":95,"props":2845,"children":2846},{"style":152},[2847],{"type":37,"value":2848},"'analytics_123456'",{"type":32,"tag":95,"props":2850,"children":2851},{"style":108},[2852],{"type":37,"value":572},{"type":32,"tag":95,"props":2854,"children":2855},{"class":97,"line":158},[2856,2861,2865,2869],{"type":32,"tag":95,"props":2857,"children":2858},{"style":2592},[2859],{"type":37,"value":2860},"    dataset_id",{"type":32,"tag":95,"props":2862,"children":2863},{"style":432},[2864],{"type":37,"value":839},{"type":32,"tag":95,"props":2866,"children":2867},{"style":152},[2868],{"type":37,"value":627},{"type":32,"tag":95,"props":2870,"children":2871},{"style":108},[2872],{"type":37,"value":572},{"type":32,"tag":95,"props":2874,"children":2875},{"class":97,"line":176},[2876,2881,2885,2890,2895,2899,2904,2909,2914,2919,2924,2929,2934],{"type":32,"tag":95,"props":2877,"children":2878},{"style":2592},[2879],{"type":37,"value":2880},"    table_id",{"type":32,"tag":95,"props":2882,"children":2883},{"style":432},[2884],{"type":37,"value":839},{"type":32,"tag":95,"props":2886,"children":2887},{"style":432},[2888],{"type":37,"value":2889},"f",{"type":32,"tag":95,"props":2891,"children":2892},{"style":152},[2893],{"type":37,"value":2894},"\"events_",{"type":32,"tag":95,"props":2896,"children":2897},{"style":114},[2898],{"type":37,"value":1987},{"type":32,"tag":95,"props":2900,"children":2901},{"style":108},[2902],{"type":37,"value":2903},"yesterday.strftime(",{"type":32,"tag":95,"props":2905,"children":2906},{"style":152},[2907],{"type":37,"value":2908},"'%Y%m",{"type":32,"tag":95,"props":2910,"children":2911},{"style":114},[2912],{"type":37,"value":2913},"%d",{"type":32,"tag":95,"props":2915,"children":2916},{"style":152},[2917],{"type":37,"value":2918},"'",{"type":32,"tag":95,"props":2920,"children":2921},{"style":108},[2922],{"type":37,"value":2923},")",{"type":32,"tag":95,"props":2925,"children":2926},{"style":114},[2927],{"type":37,"value":2928},"}",{"type":32,"tag":95,"props":2930,"children":2931},{"style":152},[2932],{"type":37,"value":2933},"\"",{"type":32,"tag":95,"props":2935,"children":2936},{"style":108},[2937],{"type":37,"value":572},{"type":32,"tag":95,"props":2939,"children":2940},{"class":97,"line":189},[2941,2946,2950],{"type":32,"tag":95,"props":2942,"children":2943},{"style":2592},[2944],{"type":37,"value":2945},"    poke_interval",{"type":32,"tag":95,"props":2947,"children":2948},{"style":432},[2949],{"type":37,"value":839},{"type":32,"tag":95,"props":2951,"children":2952},{"style":114},[2953],{"type":37,"value":2954},"300\n",{"type":32,"tag":95,"props":2956,"children":2957},{"class":97,"line":211},[2958],{"type":32,"tag":95,"props":2959,"children":2960},{"style":108},[2961],{"type":37,"value":985},{"type":32,"tag":33,"props":2963,"children":2964},{},[2965],{"type":37,"value":2966},"Wenn Partition da ist, startet die dbt-Kette. Dieses Pattern löst das Problem \"verspätete Daten stoppen Pipeline\" — stattdessen wartet die Pipeline.",{"type":32,"tag":40,"props":2968,"children":2970},{"id":2969},"tradeoffs-was-dbt-nicht-löst",[2971],{"type":37,"value":2972},"Tradeoffs: Was dbt nicht löst",{"type":32,"tag":33,"props":2974,"children":2975},{},[2976],{"type":37,"value":2977},"dbt ist Transformations-Engine, keine Data-Loading-Engine. Wer zieht Daten in BigQuery? Fivetran, Airbyte, Custom-Python-Skript. dbt geht davon aus, dass Raw Data schon da ist. ELT-Pattern: Extract-Load-Transform. Unterschied zu ETL: Transform findet im Warehouse statt. dbt ist diese T-Schicht, EL ist separate Toolchain.",{"type":32,"tag":33,"props":2979,"children":2980},{},[2981],{"type":37,"value":2982},"dbt unterstützt kein echtes Real-Time-Streaming. Kafka → BigQuery Streaming Insert → dbt Incremental Model Chain bedeutet Minuten-Latenz. Für Sub-Sekunden-Latenz (Fraud Detection, Dynamic Pricing) reicht dbt nicht — Sie brauchen Flink, Spark Structured Streaming oder Materialize.",{"type":32,"tag":33,"props":2984,"children":2985},{},[2986],{"type":37,"value":2987},"dbt Python-Model-Support (v1.3+) ist begrenzt. Sie können Pandas DataFrame manipulieren, aber schweres ML-Training läuft nicht in dbt. Feature Engineering in dbt, Model Training auf Vertex AI, Inference auf BigQuery ML ist das Muster. dbt Python-Modell sieht so aus:",{"type":32,"tag":85,"props":2989,"children":2991},{"className":2512,"code":2990,"language":2514,"meta":16,"style":16},"def model(dbt, session):\n    df = dbt.ref('stg_orders').to_pandas()\n    df['log_amount'] = np.log1p(df['order_amount'])\n    return df\n",[2992],{"type":32,"tag":52,"props":2993,"children":2994},{"__ignoreMap":16},[2995,3014,3041,3078],{"type":32,"tag":95,"props":2996,"children":2997},{"class":97,"line":98},[2998,3003,3009],{"type":32,"tag":95,"props":2999,"children":3000},{"style":432},[3001],{"type":37,"value":3002},"def",{"type":32,"tag":95,"props":3004,"children":3006},{"style":3005},"--shiki-default:#B392F0",[3007],{"type":37,"value":3008}," model",{"type":32,"tag":95,"props":3010,"children":3011},{"style":108},[3012],{"type":37,"value":3013},"(dbt, session):\n",{"type":32,"tag":95,"props":3015,"children":3016},{"class":97,"line":120},[3017,3022,3026,3031,3036],{"type":32,"tag":95,"props":3018,"children":3019},{"style":108},[3020],{"type":37,"value":3021},"    df ",{"type":32,"tag":95,"props":3023,"children":3024},{"style":432},[3025],{"type":37,"value":839},{"type":32,"tag":95,"props":3027,"children":3028},{"style":108},[3029],{"type":37,"value":3030}," dbt.ref(",{"type":32,"tag":95,"props":3032,"children":3033},{"style":152},[3034],{"type":37,"value":3035},"'stg_orders'",{"type":32,"tag":95,"props":3037,"children":3038},{"style":108},[3039],{"type":37,"value":3040},").to_pandas()\n",{"type":32,"tag":95,"props":3042,"children":3043},{"class":97,"line":134},[3044,3049,3054,3059,3063,3068,3073],{"type":32,"tag":95,"props":3045,"children":3046},{"style":108},[3047],{"type":37,"value":3048},"    df[",{"type":32,"tag":95,"props":3050,"children":3051},{"style":152},[3052],{"type":37,"value":3053},"'log_amount'",{"type":32,"tag":95,"props":3055,"children":3056},{"style":108},[3057],{"type":37,"value":3058},"] ",{"type":32,"tag":95,"props":3060,"children":3061},{"style":432},[3062],{"type":37,"value":839},{"type":32,"tag":95,"props":3064,"children":3065},{"style":108},[3066],{"type":37,"value":3067}," np.log1p(df[",{"type":32,"tag":95,"props":3069,"children":3070},{"style":152},[3071],{"type":37,"value":3072},"'order_amount'",{"type":32,"tag":95,"props":3074,"children":3075},{"style":108},[3076],{"type":37,"value":3077},"])\n",{"type":32,"tag":95,"props":3079,"children":3080},{"class":97,"line":158},[3081,3086],{"type":32,"tag":95,"props":3082,"children":3083},{"style":432},[3084],{"type":37,"value":3085},"    return",{"type":32,"tag":95,"props":3087,"children":3088},{"style":108},[3089],{"type":37,"value":3090}," df\n",{"type":32,"tag":33,"props":3092,"children":3093},{},[3094],{"type":37,"value":3095},"Aber nur Feature-Generation — Sie trainieren kein scikit-learn Modell. BigQuery Compute ist teuer, Python Runtime hat Overhead. Komplexe Transformationen laufen in SQL schneller.",{"type":32,"tag":40,"props":3097,"children":3099},{"id":3098},"jetzt-beginnen",[3100],{"type":37,"value":3101},"Jetzt beginnen",{"type":32,"tag":33,"props":3103,"children":3104},{},[3105],{"type":37,"value":3106},"Wenn Marketing-Daten noch in Spreadsheets manu",{"type":32,"tag":3108,"props":3109,"children":3110},"style",{},[3111],{"type":37,"value":3112},"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);}",{"title":16,"searchDepth":134,"depth":134,"links":3114},[3115,3116,3117,3118,3119,3120,3121,3122],{"id":42,"depth":120,"text":45},{"id":402,"depth":120,"text":405},{"id":1104,"depth":120,"text":1107},{"id":1522,"depth":120,"text":1525},{"id":1897,"depth":120,"text":1900},{"id":2501,"depth":120,"text":2504},{"id":2969,"depth":120,"text":2972},{"id":3098,"depth":120,"text":3101},"markdown","content:de:data:dbt-bigquery-moderner-marketing-data-stack.md","content","de\u002Fdata\u002Fdbt-bigquery-moderner-marketing-data-stack.md","de\u002Fdata\u002Fdbt-bigquery-moderner-marketing-data-stack","md",1782050752040]