[{"data":1,"prerenderedAt":2717},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fde\u002Fdata\u002Fcohort-tabellenstruktur":13},{"i18nKey":4,"paths":5},"data-007-2026-05",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fdata\u002Fcohort-tabellenstruktur","\u002Fen\u002Fdata\u002Fcohort-table-architecture-scaling-retention-analysis-production","\u002Fes\u002Fdata\u002Farquitectura-tabla-cohort","\u002Ffr\u002Fdata\u002Fcohort-table-architecture","\u002Fit\u002Fdata\u002Farchitettura-tabella-cohort-retention-production","\u002Fru\u002Fdata\u002Fcohort-tablesql-architecture-production-retention","\u002Ftr\u002Fdata\u002Fcohort-tablo-mimarisi-retention-analizinin-productionda-olceklenmesi",{"_path":6,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":20,"i18nKey":4,"tags":21,"readingTime":27,"author":28,"body":29,"_type":2711,"_id":2712,"_source":2713,"_file":2714,"_stem":2715,"_extension":2716},"data",false,"","Cohort-Tabellenstruktur: Retention-Analysen in der Production skalieren","Materialized Views, Partitionierung und Query-Kostenoptimierung für Cohort-Analysen über Millionen von Nutzern: production-ready BigQuery-Architektur.","2026-05-22","verianalizi",[22,23,24,25,26],"cohort-analysis","bigquery","materialized-views","retention-engineering","query-optimization",9,"Roibase",{"type":30,"children":31,"toc":2701},"root",[32,40,47,52,532,545,551,579,671,676,682,687,849,869,874,1204,1209,1215,1220,1264,1269,2152,2168,2174,2179,2217,2222,2309,2314,2320,2325,2339,2351,2441,2446,2452,2457,2498,2512,2518,2523,2556,2561,2685,2690,2695],{"type":33,"tag":34,"props":35,"children":36},"element","p",{},[37],{"type":38,"value":39},"text","Retention-Analysen sind eine der mächtigsten Methoden, um Nutzerverhalten zu verstehen. Aber im echten Maßstab — Millionen von Events pro Tag, Hunderttausende von Nutzern — scheitern naive SQL-Abfragen nach 30 Sekunden oder erschöpfen die Slot-Kapazität. Production-ready Cohort-Analysen erfordern es, die Tabellenstruktur für die Query-Engine zu optimieren. In diesem Artikel zeigen wir dir, wie du Cohort-Tabellen in BigQuery mit Materialized Views, Partitionierung und inkrementellen Refresh-Strategien skalierst.",{"type":33,"tag":41,"props":42,"children":44},"h2",{"id":43},"warum-naive-cohort-abfragen-scheitern",[45],{"type":38,"value":46},"Warum naive Cohort-Abfragen scheitern",{"type":33,"tag":34,"props":48,"children":49},{},[50],{"type":38,"value":51},"Klassische Cohort-Analysen funktionieren nach dieser Logik: Finde das erste Aktivitätsdatum des Nutzers (cohort_date), berechne alle nachfolgenden Aktivitäten als „N. Tag\" relativ zu diesem Datum, aggregiere die Retention-Rate nach Gruppe. Das folgende SQL ist logisch korrekt, funktioniert aber nicht in der Production:",{"type":33,"tag":53,"props":54,"children":58},"pre",{"className":55,"code":56,"language":57,"meta":16,"style":16},"language-sql shiki shiki-themes github-dark","WITH first_event AS (\n  SELECT user_id, MIN(DATE(event_timestamp)) AS cohort_date\n  FROM `project.dataset.events`\n  GROUP BY user_id\n),\ndaily_activity AS (\n  SELECT e.user_id, DATE(e.event_timestamp) AS activity_date\n  FROM `project.dataset.events` e\n  GROUP BY 1,2\n)\nSELECT \n  f.cohort_date,\n  DATE_DIFF(d.activity_date, f.cohort_date, DAY) AS day_n,\n  COUNT(DISTINCT d.user_id) AS retained_users\nFROM first_event f\nJOIN daily_activity d USING(user_id)\nGROUP BY 1,2\nORDER BY 1,2;\n","sql",[59],{"type":33,"tag":60,"props":61,"children":62},"code",{"__ignoreMap":16},[63,91,135,150,164,173,190,254,272,294,303,317,340,402,446,460,484,505],{"type":33,"tag":64,"props":65,"children":68},"span",{"class":66,"line":67},"line",1,[69,75,81,86],{"type":33,"tag":64,"props":70,"children":72},{"style":71},"--shiki-default:#F97583",[73],{"type":38,"value":74},"WITH",{"type":33,"tag":64,"props":76,"children":78},{"style":77},"--shiki-default:#E1E4E8",[79],{"type":38,"value":80}," first_event ",{"type":33,"tag":64,"props":82,"children":83},{"style":71},[84],{"type":38,"value":85},"AS",{"type":33,"tag":64,"props":87,"children":88},{"style":77},[89],{"type":38,"value":90}," (\n",{"type":33,"tag":64,"props":92,"children":94},{"class":66,"line":93},2,[95,100,105,111,116,121,126,130],{"type":33,"tag":64,"props":96,"children":97},{"style":71},[98],{"type":38,"value":99},"  SELECT",{"type":33,"tag":64,"props":101,"children":102},{"style":77},[103],{"type":38,"value":104}," user_id, ",{"type":33,"tag":64,"props":106,"children":108},{"style":107},"--shiki-default:#79B8FF",[109],{"type":38,"value":110},"MIN",{"type":33,"tag":64,"props":112,"children":113},{"style":77},[114],{"type":38,"value":115},"(",{"type":33,"tag":64,"props":117,"children":118},{"style":71},[119],{"type":38,"value":120},"DATE",{"type":33,"tag":64,"props":122,"children":123},{"style":77},[124],{"type":38,"value":125},"(event_timestamp)) ",{"type":33,"tag":64,"props":127,"children":128},{"style":71},[129],{"type":38,"value":85},{"type":33,"tag":64,"props":131,"children":132},{"style":77},[133],{"type":38,"value":134}," cohort_date\n",{"type":33,"tag":64,"props":136,"children":138},{"class":66,"line":137},3,[139,144],{"type":33,"tag":64,"props":140,"children":141},{"style":71},[142],{"type":38,"value":143},"  FROM",{"type":33,"tag":64,"props":145,"children":147},{"style":146},"--shiki-default:#9ECBFF",[148],{"type":38,"value":149}," `project.dataset.events`\n",{"type":33,"tag":64,"props":151,"children":153},{"class":66,"line":152},4,[154,159],{"type":33,"tag":64,"props":155,"children":156},{"style":71},[157],{"type":38,"value":158},"  GROUP BY",{"type":33,"tag":64,"props":160,"children":161},{"style":77},[162],{"type":38,"value":163}," user_id\n",{"type":33,"tag":64,"props":165,"children":167},{"class":66,"line":166},5,[168],{"type":33,"tag":64,"props":169,"children":170},{"style":77},[171],{"type":38,"value":172},"),\n",{"type":33,"tag":64,"props":174,"children":176},{"class":66,"line":175},6,[177,182,186],{"type":33,"tag":64,"props":178,"children":179},{"style":77},[180],{"type":38,"value":181},"daily_activity ",{"type":33,"tag":64,"props":183,"children":184},{"style":71},[185],{"type":38,"value":85},{"type":33,"tag":64,"props":187,"children":188},{"style":77},[189],{"type":38,"value":90},{"type":33,"tag":64,"props":191,"children":193},{"class":66,"line":192},7,[194,198,203,208,213,218,222,226,231,235,240,245,249],{"type":33,"tag":64,"props":195,"children":196},{"style":71},[197],{"type":38,"value":99},{"type":33,"tag":64,"props":199,"children":200},{"style":107},[201],{"type":38,"value":202}," e",{"type":33,"tag":64,"props":204,"children":205},{"style":77},[206],{"type":38,"value":207},".",{"type":33,"tag":64,"props":209,"children":210},{"style":107},[211],{"type":38,"value":212},"user_id",{"type":33,"tag":64,"props":214,"children":215},{"style":77},[216],{"type":38,"value":217},", ",{"type":33,"tag":64,"props":219,"children":220},{"style":71},[221],{"type":38,"value":120},{"type":33,"tag":64,"props":223,"children":224},{"style":77},[225],{"type":38,"value":115},{"type":33,"tag":64,"props":227,"children":228},{"style":107},[229],{"type":38,"value":230},"e",{"type":33,"tag":64,"props":232,"children":233},{"style":77},[234],{"type":38,"value":207},{"type":33,"tag":64,"props":236,"children":237},{"style":107},[238],{"type":38,"value":239},"event_timestamp",{"type":33,"tag":64,"props":241,"children":242},{"style":77},[243],{"type":38,"value":244},") ",{"type":33,"tag":64,"props":246,"children":247},{"style":71},[248],{"type":38,"value":85},{"type":33,"tag":64,"props":250,"children":251},{"style":77},[252],{"type":38,"value":253}," activity_date\n",{"type":33,"tag":64,"props":255,"children":257},{"class":66,"line":256},8,[258,262,267],{"type":33,"tag":64,"props":259,"children":260},{"style":71},[261],{"type":38,"value":143},{"type":33,"tag":64,"props":263,"children":264},{"style":146},[265],{"type":38,"value":266}," `project.dataset.events`",{"type":33,"tag":64,"props":268,"children":269},{"style":77},[270],{"type":38,"value":271}," e\n",{"type":33,"tag":64,"props":273,"children":274},{"class":66,"line":27},[275,279,284,289],{"type":33,"tag":64,"props":276,"children":277},{"style":71},[278],{"type":38,"value":158},{"type":33,"tag":64,"props":280,"children":281},{"style":107},[282],{"type":38,"value":283}," 1",{"type":33,"tag":64,"props":285,"children":286},{"style":77},[287],{"type":38,"value":288},",",{"type":33,"tag":64,"props":290,"children":291},{"style":107},[292],{"type":38,"value":293},"2\n",{"type":33,"tag":64,"props":295,"children":297},{"class":66,"line":296},10,[298],{"type":33,"tag":64,"props":299,"children":300},{"style":77},[301],{"type":38,"value":302},")\n",{"type":33,"tag":64,"props":304,"children":306},{"class":66,"line":305},11,[307,312],{"type":33,"tag":64,"props":308,"children":309},{"style":71},[310],{"type":38,"value":311},"SELECT",{"type":33,"tag":64,"props":313,"children":314},{"style":77},[315],{"type":38,"value":316}," \n",{"type":33,"tag":64,"props":318,"children":320},{"class":66,"line":319},12,[321,326,330,335],{"type":33,"tag":64,"props":322,"children":323},{"style":107},[324],{"type":38,"value":325},"  f",{"type":33,"tag":64,"props":327,"children":328},{"style":77},[329],{"type":38,"value":207},{"type":33,"tag":64,"props":331,"children":332},{"style":107},[333],{"type":38,"value":334},"cohort_date",{"type":33,"tag":64,"props":336,"children":337},{"style":77},[338],{"type":38,"value":339},",\n",{"type":33,"tag":64,"props":341,"children":343},{"class":66,"line":342},13,[344,349,354,358,363,367,372,376,380,384,389,393,397],{"type":33,"tag":64,"props":345,"children":346},{"style":77},[347],{"type":38,"value":348},"  DATE_DIFF(",{"type":33,"tag":64,"props":350,"children":351},{"style":107},[352],{"type":38,"value":353},"d",{"type":33,"tag":64,"props":355,"children":356},{"style":77},[357],{"type":38,"value":207},{"type":33,"tag":64,"props":359,"children":360},{"style":107},[361],{"type":38,"value":362},"activity_date",{"type":33,"tag":64,"props":364,"children":365},{"style":77},[366],{"type":38,"value":217},{"type":33,"tag":64,"props":368,"children":369},{"style":107},[370],{"type":38,"value":371},"f",{"type":33,"tag":64,"props":373,"children":374},{"style":77},[375],{"type":38,"value":207},{"type":33,"tag":64,"props":377,"children":378},{"style":107},[379],{"type":38,"value":334},{"type":33,"tag":64,"props":381,"children":382},{"style":77},[383],{"type":38,"value":217},{"type":33,"tag":64,"props":385,"children":386},{"style":71},[387],{"type":38,"value":388},"DAY",{"type":33,"tag":64,"props":390,"children":391},{"style":77},[392],{"type":38,"value":244},{"type":33,"tag":64,"props":394,"children":395},{"style":71},[396],{"type":38,"value":85},{"type":33,"tag":64,"props":398,"children":399},{"style":77},[400],{"type":38,"value":401}," day_n,\n",{"type":33,"tag":64,"props":403,"children":405},{"class":66,"line":404},14,[406,411,415,420,425,429,433,437,441],{"type":33,"tag":64,"props":407,"children":408},{"style":107},[409],{"type":38,"value":410},"  COUNT",{"type":33,"tag":64,"props":412,"children":413},{"style":77},[414],{"type":38,"value":115},{"type":33,"tag":64,"props":416,"children":417},{"style":71},[418],{"type":38,"value":419},"DISTINCT",{"type":33,"tag":64,"props":421,"children":422},{"style":107},[423],{"type":38,"value":424}," d",{"type":33,"tag":64,"props":426,"children":427},{"style":77},[428],{"type":38,"value":207},{"type":33,"tag":64,"props":430,"children":431},{"style":107},[432],{"type":38,"value":212},{"type":33,"tag":64,"props":434,"children":435},{"style":77},[436],{"type":38,"value":244},{"type":33,"tag":64,"props":438,"children":439},{"style":71},[440],{"type":38,"value":85},{"type":33,"tag":64,"props":442,"children":443},{"style":77},[444],{"type":38,"value":445}," retained_users\n",{"type":33,"tag":64,"props":447,"children":449},{"class":66,"line":448},15,[450,455],{"type":33,"tag":64,"props":451,"children":452},{"style":71},[453],{"type":38,"value":454},"FROM",{"type":33,"tag":64,"props":456,"children":457},{"style":77},[458],{"type":38,"value":459}," first_event f\n",{"type":33,"tag":64,"props":461,"children":463},{"class":66,"line":462},16,[464,469,474,479],{"type":33,"tag":64,"props":465,"children":466},{"style":71},[467],{"type":38,"value":468},"JOIN",{"type":33,"tag":64,"props":470,"children":471},{"style":77},[472],{"type":38,"value":473}," daily_activity d ",{"type":33,"tag":64,"props":475,"children":476},{"style":71},[477],{"type":38,"value":478},"USING",{"type":33,"tag":64,"props":480,"children":481},{"style":77},[482],{"type":38,"value":483},"(user_id)\n",{"type":33,"tag":64,"props":485,"children":487},{"class":66,"line":486},17,[488,493,497,501],{"type":33,"tag":64,"props":489,"children":490},{"style":71},[491],{"type":38,"value":492},"GROUP BY",{"type":33,"tag":64,"props":494,"children":495},{"style":107},[496],{"type":38,"value":283},{"type":33,"tag":64,"props":498,"children":499},{"style":77},[500],{"type":38,"value":288},{"type":33,"tag":64,"props":502,"children":503},{"style":107},[504],{"type":38,"value":293},{"type":33,"tag":64,"props":506,"children":508},{"class":66,"line":507},18,[509,514,518,522,527],{"type":33,"tag":64,"props":510,"children":511},{"style":71},[512],{"type":38,"value":513},"ORDER BY",{"type":33,"tag":64,"props":515,"children":516},{"style":107},[517],{"type":38,"value":283},{"type":33,"tag":64,"props":519,"children":520},{"style":77},[521],{"type":38,"value":288},{"type":33,"tag":64,"props":523,"children":524},{"style":107},[525],{"type":38,"value":526},"2",{"type":33,"tag":64,"props":528,"children":529},{"style":77},[530],{"type":38,"value":531},";\n",{"type":33,"tag":34,"props":533,"children":534},{},[535,537,543],{"type":38,"value":536},"Zwei große Probleme: (1) Die ",{"type":33,"tag":60,"props":538,"children":540},{"className":539},[],[541],{"type":38,"value":542},"events",{"type":38,"value":544},"-Tabelle wird jedes Mal vollständig gescannt — es gibt keine Partition Pruning, (2) für jedes cohort_date werden alle Nutzer und alle ihre Aktivitäten gejoined — Gefahr der kartesischen Explosion. Bei 100M Events bearbeitet diese Query 400GB Daten und dauert 2 Minuten. Für tägliche Refreshes ist das nicht nachhaltig. Die BigQuery-Rechnung vervielfacht sich zum Monatsende um das 10-Fache.",{"type":33,"tag":41,"props":546,"children":548},{"id":547},"partitionierte-basis-tabelle-reduziert-scanning-overhead",[549],{"type":38,"value":550},"Partitionierte Basis-Tabelle reduziert Scanning-Overhead",{"type":33,"tag":34,"props":552,"children":553},{},[554,556,561,563,569,571,577],{"type":38,"value":555},"Der erste Schritt: Partitioniere die ",{"type":33,"tag":60,"props":557,"children":559},{"className":558},[],[560],{"type":38,"value":542},{"type":38,"value":562},"-Tabelle nach ",{"type":33,"tag":60,"props":564,"children":566},{"className":565},[],[567],{"type":38,"value":568},"DATE(event_timestamp)",{"type":38,"value":570},". Das ermöglicht es dem Query-Planer, nur relevante Partitionen zu scannen, wenn der Query ",{"type":33,"tag":60,"props":572,"children":574},{"className":573},[],[575],{"type":38,"value":576},"WHERE DATE(event_timestamp) BETWEEN X AND Y",{"type":38,"value":578}," enthält:",{"type":33,"tag":53,"props":580,"children":582},{"className":55,"code":581,"language":57,"meta":16,"style":16},"CREATE TABLE `project.dataset.events`\nPARTITION BY DATE(event_timestamp)\nCLUSTER BY user_id, event_name\nAS SELECT * FROM ...;\n",[583],{"type":33,"tag":60,"props":584,"children":585},{"__ignoreMap":16},[586,603,626,644],{"type":33,"tag":64,"props":587,"children":588},{"class":66,"line":67},[589,594,599],{"type":33,"tag":64,"props":590,"children":591},{"style":71},[592],{"type":38,"value":593},"CREATE",{"type":33,"tag":64,"props":595,"children":596},{"style":71},[597],{"type":38,"value":598}," TABLE",{"type":33,"tag":64,"props":600,"children":601},{"style":146},[602],{"type":38,"value":149},{"type":33,"tag":64,"props":604,"children":605},{"class":66,"line":93},[606,611,616,621],{"type":33,"tag":64,"props":607,"children":608},{"style":71},[609],{"type":38,"value":610},"PARTITION",{"type":33,"tag":64,"props":612,"children":613},{"style":71},[614],{"type":38,"value":615}," BY",{"type":33,"tag":64,"props":617,"children":618},{"style":71},[619],{"type":38,"value":620}," DATE",{"type":33,"tag":64,"props":622,"children":623},{"style":77},[624],{"type":38,"value":625},"(event_timestamp)\n",{"type":33,"tag":64,"props":627,"children":628},{"class":66,"line":137},[629,634,639],{"type":33,"tag":64,"props":630,"children":631},{"style":77},[632],{"type":38,"value":633},"CLUSTER ",{"type":33,"tag":64,"props":635,"children":636},{"style":71},[637],{"type":38,"value":638},"BY",{"type":33,"tag":64,"props":640,"children":641},{"style":77},[642],{"type":38,"value":643}," user_id, event_name\n",{"type":33,"tag":64,"props":645,"children":646},{"class":66,"line":152},[647,651,656,661,666],{"type":33,"tag":64,"props":648,"children":649},{"style":71},[650],{"type":38,"value":85},{"type":33,"tag":64,"props":652,"children":653},{"style":71},[654],{"type":38,"value":655}," SELECT",{"type":33,"tag":64,"props":657,"children":658},{"style":71},[659],{"type":38,"value":660}," *",{"type":33,"tag":64,"props":662,"children":663},{"style":71},[664],{"type":38,"value":665}," FROM",{"type":33,"tag":64,"props":667,"children":668},{"style":77},[669],{"type":38,"value":670}," ...;\n",{"type":33,"tag":34,"props":672,"children":673},{},[674],{"type":38,"value":675},"Clustering nach (user_id, event_name) stellt sicher, dass Events desselben Nutzers physisch in benachbarten Blöcken gespeichert sind — das Join-Performance verbessert sich um 30–50%. Aber das reicht nicht; die Cohort-Berechnungslogik wird mit jeder Abfrage erneut ausgeführt. Hier kommen Materialized Views ins Spiel.",{"type":33,"tag":41,"props":677,"children":679},{"id":678},"materialized-view-inkrementelle-cohort-tabelle",[680],{"type":38,"value":681},"Materialized View: Inkrementelle Cohort-Tabelle",{"type":33,"tag":34,"props":683,"children":684},{},[685],{"type":38,"value":686},"BigQuery Materialized Views speichern Query-Ergebnisse physisch und aktualisieren sie automatisch, wenn sich die Basis-Tabelle ändert. Für Cohort-Analysen verwenden wir diese Struktur:",{"type":33,"tag":53,"props":688,"children":690},{"className":55,"code":689,"language":57,"meta":16,"style":16},"CREATE MATERIALIZED VIEW `project.dataset.user_cohorts`\nPARTITION BY cohort_date\nCLUSTER BY user_id\nAS\nSELECT \n  user_id,\n  MIN(DATE(event_timestamp)) AS cohort_date,\n  COUNT(*) AS first_day_events\nFROM `project.dataset.events`\nGROUP BY user_id;\n",[691],{"type":33,"tag":60,"props":692,"children":693},{"__ignoreMap":16},[694,711,726,741,749,760,768,797,826,837],{"type":33,"tag":64,"props":695,"children":696},{"class":66,"line":67},[697,701,706],{"type":33,"tag":64,"props":698,"children":699},{"style":71},[700],{"type":38,"value":593},{"type":33,"tag":64,"props":702,"children":703},{"style":77},[704],{"type":38,"value":705}," MATERIALIZED VIEW ",{"type":33,"tag":64,"props":707,"children":708},{"style":146},[709],{"type":38,"value":710},"`project.dataset.user_cohorts`\n",{"type":33,"tag":64,"props":712,"children":713},{"class":66,"line":93},[714,718,722],{"type":33,"tag":64,"props":715,"children":716},{"style":71},[717],{"type":38,"value":610},{"type":33,"tag":64,"props":719,"children":720},{"style":71},[721],{"type":38,"value":615},{"type":33,"tag":64,"props":723,"children":724},{"style":77},[725],{"type":38,"value":134},{"type":33,"tag":64,"props":727,"children":728},{"class":66,"line":137},[729,733,737],{"type":33,"tag":64,"props":730,"children":731},{"style":77},[732],{"type":38,"value":633},{"type":33,"tag":64,"props":734,"children":735},{"style":71},[736],{"type":38,"value":638},{"type":33,"tag":64,"props":738,"children":739},{"style":77},[740],{"type":38,"value":163},{"type":33,"tag":64,"props":742,"children":743},{"class":66,"line":152},[744],{"type":33,"tag":64,"props":745,"children":746},{"style":71},[747],{"type":38,"value":748},"AS\n",{"type":33,"tag":64,"props":750,"children":751},{"class":66,"line":166},[752,756],{"type":33,"tag":64,"props":753,"children":754},{"style":71},[755],{"type":38,"value":311},{"type":33,"tag":64,"props":757,"children":758},{"style":77},[759],{"type":38,"value":316},{"type":33,"tag":64,"props":761,"children":762},{"class":66,"line":175},[763],{"type":33,"tag":64,"props":764,"children":765},{"style":77},[766],{"type":38,"value":767},"  user_id,\n",{"type":33,"tag":64,"props":769,"children":770},{"class":66,"line":192},[771,776,780,784,788,792],{"type":33,"tag":64,"props":772,"children":773},{"style":107},[774],{"type":38,"value":775},"  MIN",{"type":33,"tag":64,"props":777,"children":778},{"style":77},[779],{"type":38,"value":115},{"type":33,"tag":64,"props":781,"children":782},{"style":71},[783],{"type":38,"value":120},{"type":33,"tag":64,"props":785,"children":786},{"style":77},[787],{"type":38,"value":125},{"type":33,"tag":64,"props":789,"children":790},{"style":71},[791],{"type":38,"value":85},{"type":33,"tag":64,"props":793,"children":794},{"style":77},[795],{"type":38,"value":796}," cohort_date,\n",{"type":33,"tag":64,"props":798,"children":799},{"class":66,"line":256},[800,804,808,813,817,821],{"type":33,"tag":64,"props":801,"children":802},{"style":107},[803],{"type":38,"value":410},{"type":33,"tag":64,"props":805,"children":806},{"style":77},[807],{"type":38,"value":115},{"type":33,"tag":64,"props":809,"children":810},{"style":71},[811],{"type":38,"value":812},"*",{"type":33,"tag":64,"props":814,"children":815},{"style":77},[816],{"type":38,"value":244},{"type":33,"tag":64,"props":818,"children":819},{"style":71},[820],{"type":38,"value":85},{"type":33,"tag":64,"props":822,"children":823},{"style":77},[824],{"type":38,"value":825}," first_day_events\n",{"type":33,"tag":64,"props":827,"children":828},{"class":66,"line":27},[829,833],{"type":33,"tag":64,"props":830,"children":831},{"style":71},[832],{"type":38,"value":454},{"type":33,"tag":64,"props":834,"children":835},{"style":146},[836],{"type":38,"value":149},{"type":33,"tag":64,"props":838,"children":839},{"class":66,"line":296},[840,844],{"type":33,"tag":64,"props":841,"children":842},{"style":71},[843],{"type":38,"value":492},{"type":33,"tag":64,"props":845,"children":846},{"style":77},[847],{"type":38,"value":848}," user_id;\n",{"type":33,"tag":34,"props":850,"children":851},{},[852,854,860,862,868],{"type":38,"value":853},"Diese View berechnet das erste Datum, an dem jeder Nutzer auftritt (cohort_date), genau einmal und speichert es. Wenn neue Events ankommen, verarbeitet BigQuery nur das Delta — kein vollständiges Rescan. Durch ",{"type":33,"tag":60,"props":855,"children":857},{"className":856},[],[858],{"type":38,"value":859},"PARTITION BY cohort_date",{"type":38,"value":861}," wird Partition Pruning in Retention-Queries möglich, wie ",{"type":33,"tag":60,"props":863,"children":865},{"className":864},[],[866],{"type":38,"value":867},"WHERE cohort_date = '2026-05-01'",{"type":38,"value":207},{"type":33,"tag":34,"props":870,"children":871},{},[872],{"type":38,"value":873},"Die Retention-Berechnungsabfrage reduziert sich auf:",{"type":33,"tag":53,"props":875,"children":877},{"className":55,"code":876,"language":57,"meta":16,"style":16},"SELECT \n  c.cohort_date,\n  DATE_DIFF(DATE(e.event_timestamp), c.cohort_date, DAY) AS day_n,\n  COUNT(DISTINCT e.user_id) AS retained_users\nFROM `project.dataset.user_cohorts` c\nJOIN `project.dataset.events` e \n  ON c.user_id = e.user_id \n  AND DATE(e.event_timestamp) >= c.cohort_date\nWHERE c.cohort_date BETWEEN '2026-05-01' AND '2026-05-15'\nGROUP BY 1,2;\n",[878],{"type":33,"tag":60,"props":879,"children":880},{"__ignoreMap":16},[881,892,912,977,1016,1033,1049,1091,1141,1181],{"type":33,"tag":64,"props":882,"children":883},{"class":66,"line":67},[884,888],{"type":33,"tag":64,"props":885,"children":886},{"style":71},[887],{"type":38,"value":311},{"type":33,"tag":64,"props":889,"children":890},{"style":77},[891],{"type":38,"value":316},{"type":33,"tag":64,"props":893,"children":894},{"class":66,"line":93},[895,900,904,908],{"type":33,"tag":64,"props":896,"children":897},{"style":107},[898],{"type":38,"value":899},"  c",{"type":33,"tag":64,"props":901,"children":902},{"style":77},[903],{"type":38,"value":207},{"type":33,"tag":64,"props":905,"children":906},{"style":107},[907],{"type":38,"value":334},{"type":33,"tag":64,"props":909,"children":910},{"style":77},[911],{"type":38,"value":339},{"type":33,"tag":64,"props":913,"children":914},{"class":66,"line":137},[915,919,923,927,931,935,939,944,949,953,957,961,965,969,973],{"type":33,"tag":64,"props":916,"children":917},{"style":77},[918],{"type":38,"value":348},{"type":33,"tag":64,"props":920,"children":921},{"style":71},[922],{"type":38,"value":120},{"type":33,"tag":64,"props":924,"children":925},{"style":77},[926],{"type":38,"value":115},{"type":33,"tag":64,"props":928,"children":929},{"style":107},[930],{"type":38,"value":230},{"type":33,"tag":64,"props":932,"children":933},{"style":77},[934],{"type":38,"value":207},{"type":33,"tag":64,"props":936,"children":937},{"style":107},[938],{"type":38,"value":239},{"type":33,"tag":64,"props":940,"children":941},{"style":77},[942],{"type":38,"value":943},"), ",{"type":33,"tag":64,"props":945,"children":946},{"style":107},[947],{"type":38,"value":948},"c",{"type":33,"tag":64,"props":950,"children":951},{"style":77},[952],{"type":38,"value":207},{"type":33,"tag":64,"props":954,"children":955},{"style":107},[956],{"type":38,"value":334},{"type":33,"tag":64,"props":958,"children":959},{"style":77},[960],{"type":38,"value":217},{"type":33,"tag":64,"props":962,"children":963},{"style":71},[964],{"type":38,"value":388},{"type":33,"tag":64,"props":966,"children":967},{"style":77},[968],{"type":38,"value":244},{"type":33,"tag":64,"props":970,"children":971},{"style":71},[972],{"type":38,"value":85},{"type":33,"tag":64,"props":974,"children":975},{"style":77},[976],{"type":38,"value":401},{"type":33,"tag":64,"props":978,"children":979},{"class":66,"line":152},[980,984,988,992,996,1000,1004,1008,1012],{"type":33,"tag":64,"props":981,"children":982},{"style":107},[983],{"type":38,"value":410},{"type":33,"tag":64,"props":985,"children":986},{"style":77},[987],{"type":38,"value":115},{"type":33,"tag":64,"props":989,"children":990},{"style":71},[991],{"type":38,"value":419},{"type":33,"tag":64,"props":993,"children":994},{"style":107},[995],{"type":38,"value":202},{"type":33,"tag":64,"props":997,"children":998},{"style":77},[999],{"type":38,"value":207},{"type":33,"tag":64,"props":1001,"children":1002},{"style":107},[1003],{"type":38,"value":212},{"type":33,"tag":64,"props":1005,"children":1006},{"style":77},[1007],{"type":38,"value":244},{"type":33,"tag":64,"props":1009,"children":1010},{"style":71},[1011],{"type":38,"value":85},{"type":33,"tag":64,"props":1013,"children":1014},{"style":77},[1015],{"type":38,"value":445},{"type":33,"tag":64,"props":1017,"children":1018},{"class":66,"line":166},[1019,1023,1028],{"type":33,"tag":64,"props":1020,"children":1021},{"style":71},[1022],{"type":38,"value":454},{"type":33,"tag":64,"props":1024,"children":1025},{"style":146},[1026],{"type":38,"value":1027}," `project.dataset.user_cohorts`",{"type":33,"tag":64,"props":1029,"children":1030},{"style":77},[1031],{"type":38,"value":1032}," c\n",{"type":33,"tag":64,"props":1034,"children":1035},{"class":66,"line":175},[1036,1040,1044],{"type":33,"tag":64,"props":1037,"children":1038},{"style":71},[1039],{"type":38,"value":468},{"type":33,"tag":64,"props":1041,"children":1042},{"style":146},[1043],{"type":38,"value":266},{"type":33,"tag":64,"props":1045,"children":1046},{"style":77},[1047],{"type":38,"value":1048}," e \n",{"type":33,"tag":64,"props":1050,"children":1051},{"class":66,"line":192},[1052,1057,1062,1066,1070,1075,1079,1083,1087],{"type":33,"tag":64,"props":1053,"children":1054},{"style":71},[1055],{"type":38,"value":1056},"  ON",{"type":33,"tag":64,"props":1058,"children":1059},{"style":107},[1060],{"type":38,"value":1061}," c",{"type":33,"tag":64,"props":1063,"children":1064},{"style":77},[1065],{"type":38,"value":207},{"type":33,"tag":64,"props":1067,"children":1068},{"style":107},[1069],{"type":38,"value":212},{"type":33,"tag":64,"props":1071,"children":1072},{"style":71},[1073],{"type":38,"value":1074}," =",{"type":33,"tag":64,"props":1076,"children":1077},{"style":107},[1078],{"type":38,"value":202},{"type":33,"tag":64,"props":1080,"children":1081},{"style":77},[1082],{"type":38,"value":207},{"type":33,"tag":64,"props":1084,"children":1085},{"style":107},[1086],{"type":38,"value":212},{"type":33,"tag":64,"props":1088,"children":1089},{"style":77},[1090],{"type":38,"value":316},{"type":33,"tag":64,"props":1092,"children":1093},{"class":66,"line":256},[1094,1099,1103,1107,1111,1115,1119,1123,1128,1132,1136],{"type":33,"tag":64,"props":1095,"children":1096},{"style":71},[1097],{"type":38,"value":1098},"  AND",{"type":33,"tag":64,"props":1100,"children":1101},{"style":71},[1102],{"type":38,"value":620},{"type":33,"tag":64,"props":1104,"children":1105},{"style":77},[1106],{"type":38,"value":115},{"type":33,"tag":64,"props":1108,"children":1109},{"style":107},[1110],{"type":38,"value":230},{"type":33,"tag":64,"props":1112,"children":1113},{"style":77},[1114],{"type":38,"value":207},{"type":33,"tag":64,"props":1116,"children":1117},{"style":107},[1118],{"type":38,"value":239},{"type":33,"tag":64,"props":1120,"children":1121},{"style":77},[1122],{"type":38,"value":244},{"type":33,"tag":64,"props":1124,"children":1125},{"style":71},[1126],{"type":38,"value":1127},">=",{"type":33,"tag":64,"props":1129,"children":1130},{"style":107},[1131],{"type":38,"value":1061},{"type":33,"tag":64,"props":1133,"children":1134},{"style":77},[1135],{"type":38,"value":207},{"type":33,"tag":64,"props":1137,"children":1138},{"style":107},[1139],{"type":38,"value":1140},"cohort_date\n",{"type":33,"tag":64,"props":1142,"children":1143},{"class":66,"line":27},[1144,1149,1153,1157,1161,1166,1171,1176],{"type":33,"tag":64,"props":1145,"children":1146},{"style":71},[1147],{"type":38,"value":1148},"WHERE",{"type":33,"tag":64,"props":1150,"children":1151},{"style":107},[1152],{"type":38,"value":1061},{"type":33,"tag":64,"props":1154,"children":1155},{"style":77},[1156],{"type":38,"value":207},{"type":33,"tag":64,"props":1158,"children":1159},{"style":107},[1160],{"type":38,"value":334},{"type":33,"tag":64,"props":1162,"children":1163},{"style":71},[1164],{"type":38,"value":1165}," BETWEEN",{"type":33,"tag":64,"props":1167,"children":1168},{"style":146},[1169],{"type":38,"value":1170}," '2026-05-01'",{"type":33,"tag":64,"props":1172,"children":1173},{"style":71},[1174],{"type":38,"value":1175}," AND",{"type":33,"tag":64,"props":1177,"children":1178},{"style":146},[1179],{"type":38,"value":1180}," '2026-05-15'\n",{"type":33,"tag":64,"props":1182,"children":1183},{"class":66,"line":296},[1184,1188,1192,1196,1200],{"type":33,"tag":64,"props":1185,"children":1186},{"style":71},[1187],{"type":38,"value":492},{"type":33,"tag":64,"props":1189,"children":1190},{"style":107},[1191],{"type":38,"value":283},{"type":33,"tag":64,"props":1193,"children":1194},{"style":77},[1195],{"type":38,"value":288},{"type":33,"tag":64,"props":1197,"children":1198},{"style":107},[1199],{"type":38,"value":526},{"type":33,"tag":64,"props":1201,"children":1202},{"style":77},[1203],{"type":38,"value":531},{"type":33,"tag":34,"props":1205,"children":1206},{},[1207],{"type":38,"value":1208},"Diese Query joined die Materialized View statt der Basis-Tabelle — die Anzahl der gescannten Zeilen fällt von Millionen auf Tausende. Aber der Query scannt immer noch die vollständige Events-Tabelle. Im nächsten Schritt erstellen wir eine pre-aggregierte Retention-Tabelle.",{"type":33,"tag":41,"props":1210,"children":1212},{"id":1211},"pre-aggregierte-retention-tabelle-die-letzte-schicht",[1213],{"type":38,"value":1214},"Pre-Aggregierte Retention-Tabelle: Die letzte Schicht",{"type":33,"tag":34,"props":1216,"children":1217},{},[1218],{"type":38,"value":1219},"Cohort-Analysen werden typischerweise auf festgelegten Intervallen betrachtet — „Day 0, Day 1, Day 7, Day 30\" — nicht für jeden Tag einzeln. Mit dbt implementieren wir diese Logik:",{"type":33,"tag":1221,"props":1222,"children":1223},"ol",{},[1224,1238,1243],{"type":33,"tag":1225,"props":1226,"children":1227},"li",{},[1228,1230,1236],{"type":38,"value":1229},"Hole täglich neue Cohorts aus der ",{"type":33,"tag":60,"props":1231,"children":1233},{"className":1232},[],[1234],{"type":38,"value":1235},"user_cohorts",{"type":38,"value":1237}," View",{"type":33,"tag":1225,"props":1239,"children":1240},{},[1241],{"type":38,"value":1242},"Berechne für jede Cohort die Retention der letzten 30 Tage (nach den ersten 30 Tagen ändert sich das nicht mehr)",{"type":33,"tag":1225,"props":1244,"children":1245},{},[1246,1248,1254,1256,1262],{"type":38,"value":1247},"Schreibe das Ergebnis ",{"type":33,"tag":1249,"props":1250,"children":1251},"strong",{},[1252],{"type":38,"value":1253},"inkrementell",{"type":38,"value":1255}," in die ",{"type":33,"tag":60,"props":1257,"children":1259},{"className":1258},[],[1260],{"type":38,"value":1261},"cohort_retention_summary",{"type":38,"value":1263},"-Tabelle",{"type":33,"tag":34,"props":1265,"children":1266},{},[1267],{"type":38,"value":1268},"dbt-Modell:",{"type":33,"tag":53,"props":1270,"children":1272},{"className":55,"code":1271,"language":57,"meta":16,"style":16},"{{\n  config(\n    materialized='incremental',\n    unique_key=['cohort_date','day_n'],\n    partition_by={'field':'cohort_date','data_type':'date'},\n    cluster_by=['day_n']\n  )\n}}\n\nWITH cohorts_to_update AS (\n  SELECT DISTINCT cohort_date \n  FROM {{ ref('user_cohorts') }}\n  WHERE cohort_date >= CURRENT_DATE() - 31\n  {% if is_incremental() %}\n    AND cohort_date > (SELECT MAX(cohort_date) FROM {{ this }})\n  {% endif %}\n),\nretention_calc AS (\n  SELECT \n    c.cohort_date,\n    DATE_DIFF(DATE(e.event_timestamp), c.cohort_date, DAY) AS day_n,\n    COUNT(DISTINCT e.user_id) AS retained_users,\n    MAX(c.first_day_events) AS cohort_size\n  FROM {{ ref('user_cohorts') }} c\n  JOIN {{ source('raw','events') }} e \n    ON c.user_id = e.user_id\n  WHERE c.cohort_date IN (SELECT cohort_date FROM cohorts_to_update)\n    AND DATE(e.event_timestamp) >= c.cohort_date\n    AND DATE_DIFF(DATE(e.event_timestamp), c.cohort_date, DAY) \u003C= 30\n  GROUP BY 1,2\n)\nSELECT \n  cohort_date,\n  day_n,\n  retained_users,\n  cohort_size,\n  SAFE_DIVIDE(retained_users, cohort_size) AS retention_rate\nFROM retention_calc;\n",[1273],{"type":33,"tag":60,"props":1274,"children":1275},{"__ignoreMap":16},[1276,1284,1292,1314,1331,1386,1403,1411,1419,1428,1448,1461,1483,1515,1533,1578,1586,1593,1609,1621,1642,1707,1749,1788,1809,1842,1880,1926,1974,2045,2065,2073,2085,2094,2103,2112,2121,2139],{"type":33,"tag":64,"props":1277,"children":1278},{"class":66,"line":67},[1279],{"type":33,"tag":64,"props":1280,"children":1281},{"style":77},[1282],{"type":38,"value":1283},"{{\n",{"type":33,"tag":64,"props":1285,"children":1286},{"class":66,"line":93},[1287],{"type":33,"tag":64,"props":1288,"children":1289},{"style":77},[1290],{"type":38,"value":1291},"  config(\n",{"type":33,"tag":64,"props":1293,"children":1294},{"class":66,"line":137},[1295,1300,1305,1310],{"type":33,"tag":64,"props":1296,"children":1297},{"style":77},[1298],{"type":38,"value":1299},"    materialized",{"type":33,"tag":64,"props":1301,"children":1302},{"style":71},[1303],{"type":38,"value":1304},"=",{"type":33,"tag":64,"props":1306,"children":1307},{"style":146},[1308],{"type":38,"value":1309},"'incremental'",{"type":33,"tag":64,"props":1311,"children":1312},{"style":77},[1313],{"type":38,"value":339},{"type":33,"tag":64,"props":1315,"children":1316},{"class":66,"line":152},[1317,1322,1326],{"type":33,"tag":64,"props":1318,"children":1319},{"style":77},[1320],{"type":38,"value":1321},"    unique_key",{"type":33,"tag":64,"props":1323,"children":1324},{"style":71},[1325],{"type":38,"value":1304},{"type":33,"tag":64,"props":1327,"children":1328},{"style":77},[1329],{"type":38,"value":1330},"['cohort_date','day_n'],\n",{"type":33,"tag":64,"props":1332,"children":1333},{"class":66,"line":166},[1334,1339,1343,1348,1353,1358,1363,1367,1372,1376,1381],{"type":33,"tag":64,"props":1335,"children":1336},{"style":77},[1337],{"type":38,"value":1338},"    partition_by",{"type":33,"tag":64,"props":1340,"children":1341},{"style":71},[1342],{"type":38,"value":1304},{"type":33,"tag":64,"props":1344,"children":1345},{"style":77},[1346],{"type":38,"value":1347},"{",{"type":33,"tag":64,"props":1349,"children":1350},{"style":146},[1351],{"type":38,"value":1352},"'field'",{"type":33,"tag":64,"props":1354,"children":1355},{"style":77},[1356],{"type":38,"value":1357},":",{"type":33,"tag":64,"props":1359,"children":1360},{"style":146},[1361],{"type":38,"value":1362},"'cohort_date'",{"type":33,"tag":64,"props":1364,"children":1365},{"style":77},[1366],{"type":38,"value":288},{"type":33,"tag":64,"props":1368,"children":1369},{"style":146},[1370],{"type":38,"value":1371},"'data_type'",{"type":33,"tag":64,"props":1373,"children":1374},{"style":77},[1375],{"type":38,"value":1357},{"type":33,"tag":64,"props":1377,"children":1378},{"style":146},[1379],{"type":38,"value":1380},"'date'",{"type":33,"tag":64,"props":1382,"children":1383},{"style":77},[1384],{"type":38,"value":1385},"},\n",{"type":33,"tag":64,"props":1387,"children":1388},{"class":66,"line":175},[1389,1394,1398],{"type":33,"tag":64,"props":1390,"children":1391},{"style":77},[1392],{"type":38,"value":1393},"    cluster_by",{"type":33,"tag":64,"props":1395,"children":1396},{"style":71},[1397],{"type":38,"value":1304},{"type":33,"tag":64,"props":1399,"children":1400},{"style":77},[1401],{"type":38,"value":1402},"['day_n']\n",{"type":33,"tag":64,"props":1404,"children":1405},{"class":66,"line":192},[1406],{"type":33,"tag":64,"props":1407,"children":1408},{"style":77},[1409],{"type":38,"value":1410},"  )\n",{"type":33,"tag":64,"props":1412,"children":1413},{"class":66,"line":256},[1414],{"type":33,"tag":64,"props":1415,"children":1416},{"style":77},[1417],{"type":38,"value":1418},"}}\n",{"type":33,"tag":64,"props":1420,"children":1421},{"class":66,"line":27},[1422],{"type":33,"tag":64,"props":1423,"children":1425},{"emptyLinePlaceholder":1424},true,[1426],{"type":38,"value":1427},"\n",{"type":33,"tag":64,"props":1429,"children":1430},{"class":66,"line":296},[1431,1435,1440,1444],{"type":33,"tag":64,"props":1432,"children":1433},{"style":71},[1434],{"type":38,"value":74},{"type":33,"tag":64,"props":1436,"children":1437},{"style":77},[1438],{"type":38,"value":1439}," cohorts_to_update ",{"type":33,"tag":64,"props":1441,"children":1442},{"style":71},[1443],{"type":38,"value":85},{"type":33,"tag":64,"props":1445,"children":1446},{"style":77},[1447],{"type":38,"value":90},{"type":33,"tag":64,"props":1449,"children":1450},{"class":66,"line":305},[1451,1456],{"type":33,"tag":64,"props":1452,"children":1453},{"style":71},[1454],{"type":38,"value":1455},"  SELECT DISTINCT",{"type":33,"tag":64,"props":1457,"children":1458},{"style":77},[1459],{"type":38,"value":1460}," cohort_date \n",{"type":33,"tag":64,"props":1462,"children":1463},{"class":66,"line":319},[1464,1468,1473,1478],{"type":33,"tag":64,"props":1465,"children":1466},{"style":71},[1467],{"type":38,"value":143},{"type":33,"tag":64,"props":1469,"children":1470},{"style":77},[1471],{"type":38,"value":1472}," {{ ref(",{"type":33,"tag":64,"props":1474,"children":1475},{"style":146},[1476],{"type":38,"value":1477},"'user_cohorts'",{"type":33,"tag":64,"props":1479,"children":1480},{"style":77},[1481],{"type":38,"value":1482},") }}\n",{"type":33,"tag":64,"props":1484,"children":1485},{"class":66,"line":342},[1486,1491,1496,1500,1505,1510],{"type":33,"tag":64,"props":1487,"children":1488},{"style":71},[1489],{"type":38,"value":1490},"  WHERE",{"type":33,"tag":64,"props":1492,"children":1493},{"style":77},[1494],{"type":38,"value":1495}," cohort_date ",{"type":33,"tag":64,"props":1497,"children":1498},{"style":71},[1499],{"type":38,"value":1127},{"type":33,"tag":64,"props":1501,"children":1502},{"style":77},[1503],{"type":38,"value":1504}," CURRENT_DATE() ",{"type":33,"tag":64,"props":1506,"children":1507},{"style":71},[1508],{"type":38,"value":1509},"-",{"type":33,"tag":64,"props":1511,"children":1512},{"style":107},[1513],{"type":38,"value":1514}," 31\n",{"type":33,"tag":64,"props":1516,"children":1517},{"class":66,"line":404},[1518,1523,1528],{"type":33,"tag":64,"props":1519,"children":1520},{"style":77},[1521],{"type":38,"value":1522},"  {% ",{"type":33,"tag":64,"props":1524,"children":1525},{"style":71},[1526],{"type":38,"value":1527},"if",{"type":33,"tag":64,"props":1529,"children":1530},{"style":77},[1531],{"type":38,"value":1532}," is_incremental() %}\n",{"type":33,"tag":64,"props":1534,"children":1535},{"class":66,"line":448},[1536,1541,1545,1550,1555,1559,1564,1569,1573],{"type":33,"tag":64,"props":1537,"children":1538},{"style":71},[1539],{"type":38,"value":1540},"    AND",{"type":33,"tag":64,"props":1542,"children":1543},{"style":77},[1544],{"type":38,"value":1495},{"type":33,"tag":64,"props":1546,"children":1547},{"style":71},[1548],{"type":38,"value":1549},">",{"type":33,"tag":64,"props":1551,"children":1552},{"style":77},[1553],{"type":38,"value":1554}," (",{"type":33,"tag":64,"props":1556,"children":1557},{"style":71},[1558],{"type":38,"value":311},{"type":33,"tag":64,"props":1560,"children":1561},{"style":107},[1562],{"type":38,"value":1563}," MAX",{"type":33,"tag":64,"props":1565,"children":1566},{"style":77},[1567],{"type":38,"value":1568},"(cohort_date) ",{"type":33,"tag":64,"props":1570,"children":1571},{"style":71},[1572],{"type":38,"value":454},{"type":33,"tag":64,"props":1574,"children":1575},{"style":77},[1576],{"type":38,"value":1577}," {{ this }})\n",{"type":33,"tag":64,"props":1579,"children":1580},{"class":66,"line":462},[1581],{"type":33,"tag":64,"props":1582,"children":1583},{"style":77},[1584],{"type":38,"value":1585},"  {% endif %}\n",{"type":33,"tag":64,"props":1587,"children":1588},{"class":66,"line":486},[1589],{"type":33,"tag":64,"props":1590,"children":1591},{"style":77},[1592],{"type":38,"value":172},{"type":33,"tag":64,"props":1594,"children":1595},{"class":66,"line":507},[1596,1601,1605],{"type":33,"tag":64,"props":1597,"children":1598},{"style":77},[1599],{"type":38,"value":1600},"retention_calc ",{"type":33,"tag":64,"props":1602,"children":1603},{"style":71},[1604],{"type":38,"value":85},{"type":33,"tag":64,"props":1606,"children":1607},{"style":77},[1608],{"type":38,"value":90},{"type":33,"tag":64,"props":1610,"children":1612},{"class":66,"line":1611},19,[1613,1617],{"type":33,"tag":64,"props":1614,"children":1615},{"style":71},[1616],{"type":38,"value":99},{"type":33,"tag":64,"props":1618,"children":1619},{"style":77},[1620],{"type":38,"value":316},{"type":33,"tag":64,"props":1622,"children":1624},{"class":66,"line":1623},20,[1625,1630,1634,1638],{"type":33,"tag":64,"props":1626,"children":1627},{"style":107},[1628],{"type":38,"value":1629},"    c",{"type":33,"tag":64,"props":1631,"children":1632},{"style":77},[1633],{"type":38,"value":207},{"type":33,"tag":64,"props":1635,"children":1636},{"style":107},[1637],{"type":38,"value":334},{"type":33,"tag":64,"props":1639,"children":1640},{"style":77},[1641],{"type":38,"value":339},{"type":33,"tag":64,"props":1643,"children":1645},{"class":66,"line":1644},21,[1646,1651,1655,1659,1663,1667,1671,1675,1679,1683,1687,1691,1695,1699,1703],{"type":33,"tag":64,"props":1647,"children":1648},{"style":77},[1649],{"type":38,"value":1650},"    DATE_DIFF(",{"type":33,"tag":64,"props":1652,"children":1653},{"style":71},[1654],{"type":38,"value":120},{"type":33,"tag":64,"props":1656,"children":1657},{"style":77},[1658],{"type":38,"value":115},{"type":33,"tag":64,"props":1660,"children":1661},{"style":107},[1662],{"type":38,"value":230},{"type":33,"tag":64,"props":1664,"children":1665},{"style":77},[1666],{"type":38,"value":207},{"type":33,"tag":64,"props":1668,"children":1669},{"style":107},[1670],{"type":38,"value":239},{"type":33,"tag":64,"props":1672,"children":1673},{"style":77},[1674],{"type":38,"value":943},{"type":33,"tag":64,"props":1676,"children":1677},{"style":107},[1678],{"type":38,"value":948},{"type":33,"tag":64,"props":1680,"children":1681},{"style":77},[1682],{"type":38,"value":207},{"type":33,"tag":64,"props":1684,"children":1685},{"style":107},[1686],{"type":38,"value":334},{"type":33,"tag":64,"props":1688,"children":1689},{"style":77},[1690],{"type":38,"value":217},{"type":33,"tag":64,"props":1692,"children":1693},{"style":71},[1694],{"type":38,"value":388},{"type":33,"tag":64,"props":1696,"children":1697},{"style":77},[1698],{"type":38,"value":244},{"type":33,"tag":64,"props":1700,"children":1701},{"style":71},[1702],{"type":38,"value":85},{"type":33,"tag":64,"props":1704,"children":1705},{"style":77},[1706],{"type":38,"value":401},{"type":33,"tag":64,"props":1708,"children":1710},{"class":66,"line":1709},22,[1711,1716,1720,1724,1728,1732,1736,1740,1744],{"type":33,"tag":64,"props":1712,"children":1713},{"style":107},[1714],{"type":38,"value":1715},"    COUNT",{"type":33,"tag":64,"props":1717,"children":1718},{"style":77},[1719],{"type":38,"value":115},{"type":33,"tag":64,"props":1721,"children":1722},{"style":71},[1723],{"type":38,"value":419},{"type":33,"tag":64,"props":1725,"children":1726},{"style":107},[1727],{"type":38,"value":202},{"type":33,"tag":64,"props":1729,"children":1730},{"style":77},[1731],{"type":38,"value":207},{"type":33,"tag":64,"props":1733,"children":1734},{"style":107},[1735],{"type":38,"value":212},{"type":33,"tag":64,"props":1737,"children":1738},{"style":77},[1739],{"type":38,"value":244},{"type":33,"tag":64,"props":1741,"children":1742},{"style":71},[1743],{"type":38,"value":85},{"type":33,"tag":64,"props":1745,"children":1746},{"style":77},[1747],{"type":38,"value":1748}," retained_users,\n",{"type":33,"tag":64,"props":1750,"children":1752},{"class":66,"line":1751},23,[1753,1758,1762,1766,1770,1775,1779,1783],{"type":33,"tag":64,"props":1754,"children":1755},{"style":107},[1756],{"type":38,"value":1757},"    MAX",{"type":33,"tag":64,"props":1759,"children":1760},{"style":77},[1761],{"type":38,"value":115},{"type":33,"tag":64,"props":1763,"children":1764},{"style":107},[1765],{"type":38,"value":948},{"type":33,"tag":64,"props":1767,"children":1768},{"style":77},[1769],{"type":38,"value":207},{"type":33,"tag":64,"props":1771,"children":1772},{"style":107},[1773],{"type":38,"value":1774},"first_day_events",{"type":33,"tag":64,"props":1776,"children":1777},{"style":77},[1778],{"type":38,"value":244},{"type":33,"tag":64,"props":1780,"children":1781},{"style":71},[1782],{"type":38,"value":85},{"type":33,"tag":64,"props":1784,"children":1785},{"style":77},[1786],{"type":38,"value":1787}," cohort_size\n",{"type":33,"tag":64,"props":1789,"children":1791},{"class":66,"line":1790},24,[1792,1796,1800,1804],{"type":33,"tag":64,"props":1793,"children":1794},{"style":71},[1795],{"type":38,"value":143},{"type":33,"tag":64,"props":1797,"children":1798},{"style":77},[1799],{"type":38,"value":1472},{"type":33,"tag":64,"props":1801,"children":1802},{"style":146},[1803],{"type":38,"value":1477},{"type":33,"tag":64,"props":1805,"children":1806},{"style":77},[1807],{"type":38,"value":1808},") }} c\n",{"type":33,"tag":64,"props":1810,"children":1812},{"class":66,"line":1811},25,[1813,1818,1823,1828,1832,1837],{"type":33,"tag":64,"props":1814,"children":1815},{"style":71},[1816],{"type":38,"value":1817},"  JOIN",{"type":33,"tag":64,"props":1819,"children":1820},{"style":77},[1821],{"type":38,"value":1822}," {{ source(",{"type":33,"tag":64,"props":1824,"children":1825},{"style":146},[1826],{"type":38,"value":1827},"'raw'",{"type":33,"tag":64,"props":1829,"children":1830},{"style":77},[1831],{"type":38,"value":288},{"type":33,"tag":64,"props":1833,"children":1834},{"style":146},[1835],{"type":38,"value":1836},"'events'",{"type":33,"tag":64,"props":1838,"children":1839},{"style":77},[1840],{"type":38,"value":1841},") }} e \n",{"type":33,"tag":64,"props":1843,"children":1845},{"class":66,"line":1844},26,[1846,1851,1855,1859,1863,1867,1871,1875],{"type":33,"tag":64,"props":1847,"children":1848},{"style":71},[1849],{"type":38,"value":1850},"    ON",{"type":33,"tag":64,"props":1852,"children":1853},{"style":107},[1854],{"type":38,"value":1061},{"type":33,"tag":64,"props":1856,"children":1857},{"style":77},[1858],{"type":38,"value":207},{"type":33,"tag":64,"props":1860,"children":1861},{"style":107},[1862],{"type":38,"value":212},{"type":33,"tag":64,"props":1864,"children":1865},{"style":71},[1866],{"type":38,"value":1074},{"type":33,"tag":64,"props":1868,"children":1869},{"style":107},[1870],{"type":38,"value":202},{"type":33,"tag":64,"props":1872,"children":1873},{"style":77},[1874],{"type":38,"value":207},{"type":33,"tag":64,"props":1876,"children":1877},{"style":107},[1878],{"type":38,"value":1879},"user_id\n",{"type":33,"tag":64,"props":1881,"children":1883},{"class":66,"line":1882},27,[1884,1888,1892,1896,1900,1905,1909,1913,1917,1921],{"type":33,"tag":64,"props":1885,"children":1886},{"style":71},[1887],{"type":38,"value":1490},{"type":33,"tag":64,"props":1889,"children":1890},{"style":107},[1891],{"type":38,"value":1061},{"type":33,"tag":64,"props":1893,"children":1894},{"style":77},[1895],{"type":38,"value":207},{"type":33,"tag":64,"props":1897,"children":1898},{"style":107},[1899],{"type":38,"value":334},{"type":33,"tag":64,"props":1901,"children":1902},{"style":71},[1903],{"type":38,"value":1904}," IN",{"type":33,"tag":64,"props":1906,"children":1907},{"style":77},[1908],{"type":38,"value":1554},{"type":33,"tag":64,"props":1910,"children":1911},{"style":71},[1912],{"type":38,"value":311},{"type":33,"tag":64,"props":1914,"children":1915},{"style":77},[1916],{"type":38,"value":1495},{"type":33,"tag":64,"props":1918,"children":1919},{"style":71},[1920],{"type":38,"value":454},{"type":33,"tag":64,"props":1922,"children":1923},{"style":77},[1924],{"type":38,"value":1925}," cohorts_to_update)\n",{"type":33,"tag":64,"props":1927,"children":1929},{"class":66,"line":1928},28,[1930,1934,1938,1942,1946,1950,1954,1958,1962,1966,1970],{"type":33,"tag":64,"props":1931,"children":1932},{"style":71},[1933],{"type":38,"value":1540},{"type":33,"tag":64,"props":1935,"children":1936},{"style":71},[1937],{"type":38,"value":620},{"type":33,"tag":64,"props":1939,"children":1940},{"style":77},[1941],{"type":38,"value":115},{"type":33,"tag":64,"props":1943,"children":1944},{"style":107},[1945],{"type":38,"value":230},{"type":33,"tag":64,"props":1947,"children":1948},{"style":77},[1949],{"type":38,"value":207},{"type":33,"tag":64,"props":1951,"children":1952},{"style":107},[1953],{"type":38,"value":239},{"type":33,"tag":64,"props":1955,"children":1956},{"style":77},[1957],{"type":38,"value":244},{"type":33,"tag":64,"props":1959,"children":1960},{"style":71},[1961],{"type":38,"value":1127},{"type":33,"tag":64,"props":1963,"children":1964},{"style":107},[1965],{"type":38,"value":1061},{"type":33,"tag":64,"props":1967,"children":1968},{"style":77},[1969],{"type":38,"value":207},{"type":33,"tag":64,"props":1971,"children":1972},{"style":107},[1973],{"type":38,"value":1140},{"type":33,"tag":64,"props":1975,"children":1977},{"class":66,"line":1976},29,[1978,1982,1987,1991,1995,1999,2003,2007,2011,2015,2019,2023,2027,2031,2035,2040],{"type":33,"tag":64,"props":1979,"children":1980},{"style":71},[1981],{"type":38,"value":1540},{"type":33,"tag":64,"props":1983,"children":1984},{"style":77},[1985],{"type":38,"value":1986}," DATE_DIFF(",{"type":33,"tag":64,"props":1988,"children":1989},{"style":71},[1990],{"type":38,"value":120},{"type":33,"tag":64,"props":1992,"children":1993},{"style":77},[1994],{"type":38,"value":115},{"type":33,"tag":64,"props":1996,"children":1997},{"style":107},[1998],{"type":38,"value":230},{"type":33,"tag":64,"props":2000,"children":2001},{"style":77},[2002],{"type":38,"value":207},{"type":33,"tag":64,"props":2004,"children":2005},{"style":107},[2006],{"type":38,"value":239},{"type":33,"tag":64,"props":2008,"children":2009},{"style":77},[2010],{"type":38,"value":943},{"type":33,"tag":64,"props":2012,"children":2013},{"style":107},[2014],{"type":38,"value":948},{"type":33,"tag":64,"props":2016,"children":2017},{"style":77},[2018],{"type":38,"value":207},{"type":33,"tag":64,"props":2020,"children":2021},{"style":107},[2022],{"type":38,"value":334},{"type":33,"tag":64,"props":2024,"children":2025},{"style":77},[2026],{"type":38,"value":217},{"type":33,"tag":64,"props":2028,"children":2029},{"style":71},[2030],{"type":38,"value":388},{"type":33,"tag":64,"props":2032,"children":2033},{"style":77},[2034],{"type":38,"value":244},{"type":33,"tag":64,"props":2036,"children":2037},{"style":71},[2038],{"type":38,"value":2039},"\u003C=",{"type":33,"tag":64,"props":2041,"children":2042},{"style":107},[2043],{"type":38,"value":2044}," 30\n",{"type":33,"tag":64,"props":2046,"children":2048},{"class":66,"line":2047},30,[2049,2053,2057,2061],{"type":33,"tag":64,"props":2050,"children":2051},{"style":71},[2052],{"type":38,"value":158},{"type":33,"tag":64,"props":2054,"children":2055},{"style":107},[2056],{"type":38,"value":283},{"type":33,"tag":64,"props":2058,"children":2059},{"style":77},[2060],{"type":38,"value":288},{"type":33,"tag":64,"props":2062,"children":2063},{"style":107},[2064],{"type":38,"value":293},{"type":33,"tag":64,"props":2066,"children":2068},{"class":66,"line":2067},31,[2069],{"type":33,"tag":64,"props":2070,"children":2071},{"style":77},[2072],{"type":38,"value":302},{"type":33,"tag":64,"props":2074,"children":2076},{"class":66,"line":2075},32,[2077,2081],{"type":33,"tag":64,"props":2078,"children":2079},{"style":71},[2080],{"type":38,"value":311},{"type":33,"tag":64,"props":2082,"children":2083},{"style":77},[2084],{"type":38,"value":316},{"type":33,"tag":64,"props":2086,"children":2088},{"class":66,"line":2087},33,[2089],{"type":33,"tag":64,"props":2090,"children":2091},{"style":77},[2092],{"type":38,"value":2093},"  cohort_date,\n",{"type":33,"tag":64,"props":2095,"children":2097},{"class":66,"line":2096},34,[2098],{"type":33,"tag":64,"props":2099,"children":2100},{"style":77},[2101],{"type":38,"value":2102},"  day_n,\n",{"type":33,"tag":64,"props":2104,"children":2106},{"class":66,"line":2105},35,[2107],{"type":33,"tag":64,"props":2108,"children":2109},{"style":77},[2110],{"type":38,"value":2111},"  retained_users,\n",{"type":33,"tag":64,"props":2113,"children":2115},{"class":66,"line":2114},36,[2116],{"type":33,"tag":64,"props":2117,"children":2118},{"style":77},[2119],{"type":38,"value":2120},"  cohort_size,\n",{"type":33,"tag":64,"props":2122,"children":2124},{"class":66,"line":2123},37,[2125,2130,2134],{"type":33,"tag":64,"props":2126,"children":2127},{"style":77},[2128],{"type":38,"value":2129},"  SAFE_DIVIDE(retained_users, cohort_size) ",{"type":33,"tag":64,"props":2131,"children":2132},{"style":71},[2133],{"type":38,"value":85},{"type":33,"tag":64,"props":2135,"children":2136},{"style":77},[2137],{"type":38,"value":2138}," retention_rate\n",{"type":33,"tag":64,"props":2140,"children":2142},{"class":66,"line":2141},38,[2143,2147],{"type":33,"tag":64,"props":2144,"children":2145},{"style":71},[2146],{"type":38,"value":454},{"type":33,"tag":64,"props":2148,"children":2149},{"style":77},[2150],{"type":38,"value":2151}," retention_calc;\n",{"type":33,"tag":34,"props":2153,"children":2154},{},[2155,2157,2166],{"type":38,"value":2156},"Dieses Modell aktualisiert täglich nur die letzten 31 Tage an Cohorts. Cohorts älter als 31 Tage haben stabile Retention — sie werden nicht neu berechnet. Der Slot-Verbrauch sinkt um 95%. In ",{"type":33,"tag":2158,"props":2159,"children":2163},"a",{"href":2160,"rel":2161},"https:\u002F\u002Fwww.roibase.com.tr\u002Fde\u002Fretention-engineering-cdp",[2162],"nofollow",[2164],{"type":38,"value":2165},"CDP & Retention Engineering",{"type":38,"value":2167}," wird diese Tabelle direkt an Dashboards angebunden — BI-Tools (Looker, Metabase) liefern Ergebnisse in 100ms.",{"type":33,"tag":41,"props":2169,"children":2171},{"id":2170},"query-kosten-und-partition-ablauf-strategien",[2172],{"type":38,"value":2173},"Query-Kosten und Partition-Ablauf-Strategien",{"type":33,"tag":34,"props":2175,"children":2176},{},[2177],{"type":38,"value":2178},"In BigQuery ist Storage billig ($0,02\u002FGB\u002FMonat), Computing teuer ($5\u002FTB gescannte Daten). Retention-Analysen sind retrospektiv, also werden alte Partitionen häufig gescannt. Zwei Optimierungen:",{"type":33,"tag":1221,"props":2180,"children":2181},{},[2182,2199],{"type":33,"tag":1225,"props":2183,"children":2184},{},[2185,2190,2192,2197],{"type":33,"tag":1249,"props":2186,"children":2187},{},[2188],{"type":38,"value":2189},"Partition Expiration:",{"type":38,"value":2191}," Lösche automatisch Partitionen aus der ",{"type":33,"tag":60,"props":2193,"children":2195},{"className":2194},[],[2196],{"type":38,"value":542},{"type":38,"value":2198},"-Tabelle, die älter als 90 Tage sind — nach der Cohort-Berechnung wird Raw-Event-Daten nicht mehr benötigt.",{"type":33,"tag":1225,"props":2200,"children":2201},{},[2202,2207,2209,2215],{"type":33,"tag":1249,"props":2203,"children":2204},{},[2205],{"type":38,"value":2206},"Clustering-Statistiken regelmäßig aktualisieren:",{"type":38,"value":2208}," ",{"type":33,"tag":60,"props":2210,"children":2212},{"className":2211},[],[2213],{"type":38,"value":2214},"ANALYZE TABLE ... UPDATE STATISTICS",{"type":38,"value":2216}," — der Query-Optimizer wählt bessere Execution Plans.",{"type":33,"tag":34,"props":2218,"children":2219},{},[2220],{"type":38,"value":2221},"Beispiel: Kostenvergleich (100M Events\u002FTag, 1M Nutzer):",{"type":33,"tag":2223,"props":2224,"children":2225},"table",{},[2226,2250],{"type":33,"tag":2227,"props":2228,"children":2229},"thead",{},[2230],{"type":33,"tag":2231,"props":2232,"children":2233},"tr",{},[2234,2240,2245],{"type":33,"tag":2235,"props":2236,"children":2237},"th",{},[2238],{"type":38,"value":2239},"Methode",{"type":33,"tag":2235,"props":2241,"children":2242},{},[2243],{"type":38,"value":2244},"Verarbeitete Daten\u002FTag",{"type":33,"tag":2235,"props":2246,"children":2247},{},[2248],{"type":38,"value":2249},"Monatliche Compute-Kosten",{"type":33,"tag":2251,"props":2252,"children":2253},"tbody",{},[2254,2273,2291],{"type":33,"tag":2231,"props":2255,"children":2256},{},[2257,2263,2268],{"type":33,"tag":2258,"props":2259,"children":2260},"td",{},[2261],{"type":38,"value":2262},"Naive Query (Full Scan)",{"type":33,"tag":2258,"props":2264,"children":2265},{},[2266],{"type":38,"value":2267},"12TB",{"type":33,"tag":2258,"props":2269,"children":2270},{},[2271],{"type":38,"value":2272},"$600",{"type":33,"tag":2231,"props":2274,"children":2275},{},[2276,2281,2286],{"type":33,"tag":2258,"props":2277,"children":2278},{},[2279],{"type":38,"value":2280},"Partitioniert + Materialized View",{"type":33,"tag":2258,"props":2282,"children":2283},{},[2284],{"type":38,"value":2285},"800GB",{"type":33,"tag":2258,"props":2287,"children":2288},{},[2289],{"type":38,"value":2290},"$40",{"type":33,"tag":2231,"props":2292,"children":2293},{},[2294,2299,2304],{"type":33,"tag":2258,"props":2295,"children":2296},{},[2297],{"type":38,"value":2298},"Pre-aggregierte Tabelle (inkrementell)",{"type":33,"tag":2258,"props":2300,"children":2301},{},[2302],{"type":38,"value":2303},"50GB",{"type":33,"tag":2258,"props":2305,"children":2306},{},[2307],{"type":38,"value":2308},"$2,50",{"type":33,"tag":34,"props":2310,"children":2311},{},[2312],{"type":38,"value":2313},"Eine pre-aggregierte Schicht reduziert die Compute-Kosten um den Faktor 240. In der Production ist dieser Unterschied kritisch — besonders wenn Retention-Analysen stündlich refreshed werden.",{"type":33,"tag":41,"props":2315,"children":2317},{"id":2316},"echtzeit-cohort-analysen-und-latenz-tradeoffs",[2318],{"type":38,"value":2319},"Echtzeit-Cohort-Analysen und Latenz-Tradeoffs",{"type":33,"tag":34,"props":2321,"children":2322},{},[2323],{"type":38,"value":2324},"Materialized Views und pre-aggregierte Strukturen führen zu Latenz-Tradeoffs: Daten verspäten sich um 1–5 Minuten. Wenn Echtzeit-Cohort-Analysen erforderlich sind (z.B. für die ersten 24 Stunden), kannst du einen hybriden Ansatz verwenden:",{"type":33,"tag":2326,"props":2327,"children":2328},"ul",{},[2329,2334],{"type":33,"tag":1225,"props":2330,"children":2331},{},[2332],{"type":38,"value":2333},"Letzte 24 Stunden: Streaming Insert + Real-Time Query (Cache deaktiviert)",{"type":33,"tag":1225,"props":2335,"children":2336},{},[2337],{"type":38,"value":2338},"Daten älter als 24 Stunden: Pre-aggregierte Tabelle",{"type":33,"tag":34,"props":2340,"children":2341},{},[2342,2344,2350],{"type":38,"value":2343},"BI-Queries verbinden beide Quellen mit ",{"type":33,"tag":60,"props":2345,"children":2347},{"className":2346},[],[2348],{"type":38,"value":2349},"UNION ALL",{"type":38,"value":1357},{"type":33,"tag":53,"props":2352,"children":2354},{"className":55,"code":2353,"language":57,"meta":16,"style":16},"SELECT * FROM cohort_retention_summary WHERE cohort_date \u003C CURRENT_DATE()\nUNION ALL\nSELECT * FROM realtime_cohort_view WHERE cohort_date = CURRENT_DATE();\n",[2355],{"type":33,"tag":60,"props":2356,"children":2357},{"__ignoreMap":16},[2358,2396,2404],{"type":33,"tag":64,"props":2359,"children":2360},{"class":66,"line":67},[2361,2365,2369,2373,2378,2382,2386,2391],{"type":33,"tag":64,"props":2362,"children":2363},{"style":71},[2364],{"type":38,"value":311},{"type":33,"tag":64,"props":2366,"children":2367},{"style":71},[2368],{"type":38,"value":660},{"type":33,"tag":64,"props":2370,"children":2371},{"style":71},[2372],{"type":38,"value":665},{"type":33,"tag":64,"props":2374,"children":2375},{"style":77},[2376],{"type":38,"value":2377}," cohort_retention_summary ",{"type":33,"tag":64,"props":2379,"children":2380},{"style":71},[2381],{"type":38,"value":1148},{"type":33,"tag":64,"props":2383,"children":2384},{"style":77},[2385],{"type":38,"value":1495},{"type":33,"tag":64,"props":2387,"children":2388},{"style":71},[2389],{"type":38,"value":2390},"\u003C",{"type":33,"tag":64,"props":2392,"children":2393},{"style":77},[2394],{"type":38,"value":2395}," CURRENT_DATE()\n",{"type":33,"tag":64,"props":2397,"children":2398},{"class":66,"line":93},[2399],{"type":33,"tag":64,"props":2400,"children":2401},{"style":71},[2402],{"type":38,"value":2403},"UNION ALL\n",{"type":33,"tag":64,"props":2405,"children":2406},{"class":66,"line":137},[2407,2411,2415,2419,2424,2428,2432,2436],{"type":33,"tag":64,"props":2408,"children":2409},{"style":71},[2410],{"type":38,"value":311},{"type":33,"tag":64,"props":2412,"children":2413},{"style":71},[2414],{"type":38,"value":660},{"type":33,"tag":64,"props":2416,"children":2417},{"style":71},[2418],{"type":38,"value":665},{"type":33,"tag":64,"props":2420,"children":2421},{"style":77},[2422],{"type":38,"value":2423}," realtime_cohort_view ",{"type":33,"tag":64,"props":2425,"children":2426},{"style":71},[2427],{"type":38,"value":1148},{"type":33,"tag":64,"props":2429,"children":2430},{"style":77},[2431],{"type":38,"value":1495},{"type":33,"tag":64,"props":2433,"children":2434},{"style":71},[2435],{"type":38,"value":1304},{"type":33,"tag":64,"props":2437,"children":2438},{"style":77},[2439],{"type":38,"value":2440}," CURRENT_DATE();\n",{"type":33,"tag":34,"props":2442,"children":2443},{},[2444],{"type":38,"value":2445},"Die Real-Time View ist zwar teuer, läuft aber nur für die aktuelle Cohort — der gesamte Compute-Overhead bleibt begrenzt.",{"type":33,"tag":41,"props":2447,"children":2449},{"id":2448},"cohort-segmentierung-und-kardinalitäts-explosion",[2450],{"type":38,"value":2451},"Cohort-Segmentierung und Kardinalitäts-Explosion",{"type":33,"tag":34,"props":2453,"children":2454},{},[2455],{"type":38,"value":2456},"Das Aufschlüsseln der Retention nach Nutzer-Segmenten (Plattform, Land, Akquisitionskanal) kann zu Kardinalitätsproblemen führen. Beispiel: 5 Segmente × 30 Tage × 365 Cohorts = 54.750 eindeutige Zeilen. In diesem Fall:",{"type":33,"tag":1221,"props":2458,"children":2459},{},[2460,2470,2480],{"type":33,"tag":1225,"props":2461,"children":2462},{},[2463,2468],{"type":33,"tag":1249,"props":2464,"children":2465},{},[2466],{"type":38,"value":2467},"Segment-Anzahl begrenzen:",{"type":38,"value":2469}," Analysiere nur die 3–5 wichtigsten Segmente. Für andere erstelle separate Tabellen.",{"type":33,"tag":1225,"props":2471,"children":2472},{},[2473,2478],{"type":33,"tag":1249,"props":2474,"children":2475},{},[2476],{"type":38,"value":2477},"Dynamische Segmentierung:",{"type":38,"value":2479}," Statt Segment-Info in der pre-aggregierten Tabelle zu speichern, nutze Join-Time Filtering — das bewahrt Query-Flexibilität, erhöht aber Slot-Nutzung.",{"type":33,"tag":1225,"props":2481,"children":2482},{},[2483,2488,2490,2496],{"type":33,"tag":1249,"props":2484,"children":2485},{},[2486],{"type":38,"value":2487},"Rollup-Tabelle:",{"type":38,"value":2489}," Erstelle eine separate Tabelle für wöchentliche Cohorts (",{"type":33,"tag":60,"props":2491,"children":2493},{"className":2492},[],[2494],{"type":38,"value":2495},"weekly_cohort_retention",{"type":38,"value":2497},") — das senkt die Kardinalität um 85%.",{"type":33,"tag":34,"props":2499,"children":2500},{},[2501,2503,2510],{"type":38,"value":2502},"In Roibase's ",{"type":33,"tag":2158,"props":2504,"children":2507},{"href":2505,"rel":2506},"https:\u002F\u002Fwww.roibase.com.tr\u002Fde\u002Fverianalizi",[2162],[2508],{"type":38,"value":2509},"Veri Analizi & İçgörü Mühendisliği",{"type":38,"value":2511}," kombinieren wir die Segment-Strategie mit Acquisition Source Attribution — Cohort-Analysen werden direkt an Kanal-Performance gekoppelt.",{"type":33,"tag":41,"props":2513,"children":2515},{"id":2514},"monitoring-und-regression-detection",[2516],{"type":38,"value":2517},"Monitoring und Regression-Detection",{"type":33,"tag":34,"props":2519,"children":2520},{},[2521],{"type":38,"value":2522},"Um Cohort-Pipelines in der Production zu überwachen, verfolge diese Metriken:",{"type":33,"tag":2326,"props":2524,"children":2525},{},[2526,2536,2546],{"type":33,"tag":1225,"props":2527,"children":2528},{},[2529,2534],{"type":33,"tag":1249,"props":2530,"children":2531},{},[2532],{"type":38,"value":2533},"Query Slot Time:",{"type":38,"value":2535}," BigQuery Slot-Nutzung des täglichen Refreshs — plötzliche Anstiege deuten auf Kardinalitäts-Explosion oder Partition Pruning-Verlust hin.",{"type":33,"tag":1225,"props":2537,"children":2538},{},[2539,2544],{"type":33,"tag":1249,"props":2540,"children":2541},{},[2542],{"type":38,"value":2543},"Row Count Delta:",{"type":38,"value":2545}," Anzahl der Zeilen, die bei jedem Refresh hinzugefügt werden — mehr als erwartet bedeutet mögliches Data-Quality-Problem.",{"type":33,"tag":1225,"props":2547,"children":2548},{},[2549,2554],{"type":33,"tag":1249,"props":2550,"children":2551},{},[2552],{"type":38,"value":2553},"Retention Rate Stddev:",{"type":38,"value":2555}," Plötzliche Sprünge von >10% in Day 1 Retention sind ein Signal für Datenqualitäts-Probleme.",{"type":33,"tag":34,"props":2557,"children":2558},{},[2559],{"type":38,"value":2560},"Du kannst diese Checks als Tests in dbt integrieren:",{"type":33,"tag":53,"props":2562,"children":2566},{"className":2563,"code":2564,"language":2565,"meta":16,"style":16},"language-yaml shiki shiki-themes github-dark","tests:\n  - dbt_utils.expression_is_true:\n      expression: \"retention_rate BETWEEN 0 AND 1\"\n  - dbt_utils.recency:\n      datepart: day\n      field: cohort_date\n      interval: 1\n","yaml",[2567],{"type":33,"tag":60,"props":2568,"children":2569},{"__ignoreMap":16},[2570,2584,2601,2619,2635,2652,2668],{"type":33,"tag":64,"props":2571,"children":2572},{"class":66,"line":67},[2573,2579],{"type":33,"tag":64,"props":2574,"children":2576},{"style":2575},"--shiki-default:#85E89D",[2577],{"type":38,"value":2578},"tests",{"type":33,"tag":64,"props":2580,"children":2581},{"style":77},[2582],{"type":38,"value":2583},":\n",{"type":33,"tag":64,"props":2585,"children":2586},{"class":66,"line":93},[2587,2592,2597],{"type":33,"tag":64,"props":2588,"children":2589},{"style":77},[2590],{"type":38,"value":2591},"  - ",{"type":33,"tag":64,"props":2593,"children":2594},{"style":2575},[2595],{"type":38,"value":2596},"dbt_utils.expression_is_true",{"type":33,"tag":64,"props":2598,"children":2599},{"style":77},[2600],{"type":38,"value":2583},{"type":33,"tag":64,"props":2602,"children":2603},{"class":66,"line":137},[2604,2609,2614],{"type":33,"tag":64,"props":2605,"children":2606},{"style":2575},[2607],{"type":38,"value":2608},"      expression",{"type":33,"tag":64,"props":2610,"children":2611},{"style":77},[2612],{"type":38,"value":2613},": ",{"type":33,"tag":64,"props":2615,"children":2616},{"style":146},[2617],{"type":38,"value":2618},"\"retention_rate BETWEEN 0 AND 1\"\n",{"type":33,"tag":64,"props":2620,"children":2621},{"class":66,"line":152},[2622,2626,2631],{"type":33,"tag":64,"props":2623,"children":2624},{"style":77},[2625],{"type":38,"value":2591},{"type":33,"tag":64,"props":2627,"children":2628},{"style":2575},[2629],{"type":38,"value":2630},"dbt_utils.recency",{"type":33,"tag":64,"props":2632,"children":2633},{"style":77},[2634],{"type":38,"value":2583},{"type":33,"tag":64,"props":2636,"children":2637},{"class":66,"line":166},[2638,2643,2647],{"type":33,"tag":64,"props":2639,"children":2640},{"style":2575},[2641],{"type":38,"value":2642},"      datepart",{"type":33,"tag":64,"props":2644,"children":2645},{"style":77},[2646],{"type":38,"value":2613},{"type":33,"tag":64,"props":2648,"children":2649},{"style":146},[2650],{"type":38,"value":2651},"day\n",{"type":33,"tag":64,"props":2653,"children":2654},{"class":66,"line":175},[2655,2660,2664],{"type":33,"tag":64,"props":2656,"children":2657},{"style":2575},[2658],{"type":38,"value":2659},"      field",{"type":33,"tag":64,"props":2661,"children":2662},{"style":77},[2663],{"type":38,"value":2613},{"type":33,"tag":64,"props":2665,"children":2666},{"style":146},[2667],{"type":38,"value":1140},{"type":33,"tag":64,"props":2669,"children":2670},{"class":66,"line":192},[2671,2676,2680],{"type":33,"tag":64,"props":2672,"children":2673},{"style":2575},[2674],{"type":38,"value":2675},"      interval",{"type":33,"tag":64,"props":2677,"children":2678},{"style":77},[2679],{"type":38,"value":2613},{"type":33,"tag":64,"props":2681,"children":2682},{"style":107},[2683],{"type":38,"value":2684},"1\n",{"type":33,"tag":34,"props":2686,"children":2687},{},[2688],{"type":38,"value":2689},"Wenn Tests fehlschlagen, wird ein Slack- oder PagerDuty-Alert ausgelöst — keine manuelle Überprüfung erforderlich.",{"type":33,"tag":34,"props":2691,"children":2692},{},[2693],{"type":38,"value":2694},"Cohort-Tabellenarchitektur hebt Retention-Analysen von „Ad-Hoc-Queries\" auf die Stufe „Production Data Product\". Materialized Views mit inkrementellen Refreshes, Partitionierung mit Query Pruning, Pre-Aggregation mit Slot-Optimierung — jede Schicht reduziert die Kosten um den Faktor 10. Retention-Analysen über Millionen von Nutzern und Milliarden von Events reduzieren sich auf 100ms Dashboard-Queries. Welche Retention-Patterns du überwachen möchtest, entscheidest du — aber die Daten in dieser Geschwindigkeit zu verarbeiten ist kein Engineering-Problem mehr.",{"type":33,"tag":2696,"props":2697,"children":2698},"style",{},[2699],{"type":38,"value":2700},"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":137,"depth":137,"links":2702},[2703,2704,2705,2706,2707,2708,2709,2710],{"id":43,"depth":93,"text":46},{"id":547,"depth":93,"text":550},{"id":678,"depth":93,"text":681},{"id":1211,"depth":93,"text":1214},{"id":2170,"depth":93,"text":2173},{"id":2316,"depth":93,"text":2319},{"id":2448,"depth":93,"text":2451},{"id":2514,"depth":93,"text":2517},"markdown","content:de:data:cohort-tabellenstruktur.md","content","de\u002Fdata\u002Fcohort-tabellenstruktur.md","de\u002Fdata\u002Fcohort-tabellenstruktur","md",1780898612946]