<script data-pm-proxy="intercept"></script><?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[#dbtips]]></title><description><![CDATA[Tips on Analytics Engineering]]></description><link>https://dbtips.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!VG--!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9177f9f-b6c9-4e08-a75e-363b37560035_990x990.png</url><title>#dbtips</title><link>https://dbtips.substack.com</link></image><generator>Substack</generator><lastBuildDate>Thu, 03 Sep 2026 19:11:22 GMT</lastBuildDate><atom:link href="/__u/dbtips.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Oleg Agapov]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[dbtips@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[dbtips@substack.com]]></itunes:email><itunes:name><![CDATA[Oleg Agapov]]></itunes:name></itunes:owner><itunes:author><![CDATA[Oleg Agapov]]></itunes:author><googleplay:owner><![CDATA[dbtips@substack.com]]></googleplay:owner><googleplay:email><![CDATA[dbtips@substack.com]]></googleplay:email><googleplay:author><![CDATA[Oleg Agapov]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Rise of Full Stack Analytics Engineers]]></title><description><![CDATA[Why I think every analytics engineer needs to go full stack.]]></description><link>https://dbtips.substack.com/p/the-rise-of-full-stack-analytics</link><guid isPermaLink="false">https://dbtips.substack.com/p/the-rise-of-full-stack-analytics</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Mon, 10 Aug 2026 14:34:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vKIe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07affa3b-afae-4653-b6a3-3b8d7114b8dd_7680x4320.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!vKIe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07affa3b-afae-4653-b6a3-3b8d7114b8dd_7680x4320.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!vKIe!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07affa3b-afae-4653-b6a3-3b8d7114b8dd_7680x4320.png 424w, /__u/substackcdn.com/image/fetch/$s_!vKIe!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07affa3b-afae-4653-b6a3-3b8d7114b8dd_7680x4320.png 848w, /__u/substackcdn.com/image/fetch/$s_!vKIe!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07affa3b-afae-4653-b6a3-3b8d7114b8dd_7680x4320.png 1272w, /__u/substackcdn.com/image/fetch/$s_!vKIe!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07affa3b-afae-4653-b6a3-3b8d7114b8dd_7680x4320.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!vKIe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07affa3b-afae-4653-b6a3-3b8d7114b8dd_7680x4320.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/07affa3b-afae-4653-b6a3-3b8d7114b8dd_7680x4320.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3905241,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/210510591?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07affa3b-afae-4653-b6a3-3b8d7114b8dd_7680x4320.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!vKIe!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07affa3b-afae-4653-b6a3-3b8d7114b8dd_7680x4320.png 424w, /__u/substackcdn.com/image/fetch/$s_!vKIe!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07affa3b-afae-4653-b6a3-3b8d7114b8dd_7680x4320.png 848w, /__u/substackcdn.com/image/fetch/$s_!vKIe!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07affa3b-afae-4653-b6a3-3b8d7114b8dd_7680x4320.png 1272w, /__u/substackcdn.com/image/fetch/$s_!vKIe!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F07affa3b-afae-4653-b6a3-3b8d7114b8dd_7680x4320.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>My first encounter with dbt &#8212; data build tool &#8212; left me with very weird feelings. Back then I was a pretty successful data analyst, master of SQL and wizard of Excel. When for a hundredth time I heard &#8220;dbt is amazing,&#8221; I decided to take a closer look. And dbt was weird. I mean, why would I need to install Python to run SQL? Wait, my SQL has to be compiled first? Why do I have to use terminal, instead of my IDE? All those rituals just to submit my SQL to the database? No, thanks, I don&#8217;t have time for that.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!1Mlq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ba95a8-69c9-49ce-b519-69c8708c8b2e_800x493.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!1Mlq!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ba95a8-69c9-49ce-b519-69c8708c8b2e_800x493.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!1Mlq!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ba95a8-69c9-49ce-b519-69c8708c8b2e_800x493.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!1Mlq!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ba95a8-69c9-49ce-b519-69c8708c8b2e_800x493.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!1Mlq!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ba95a8-69c9-49ce-b519-69c8708c8b2e_800x493.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!1Mlq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ba95a8-69c9-49ce-b519-69c8708c8b2e_800x493.jpeg" width="434" height="267.4525" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/77ba95a8-69c9-49ce-b519-69c8708c8b2e_800x493.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:493,&quot;width&quot;:800,&quot;resizeWidth&quot;:434,&quot;bytes&quot;:102984,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/210510591?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ba95a8-69c9-49ce-b519-69c8708c8b2e_800x493.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!1Mlq!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ba95a8-69c9-49ce-b519-69c8708c8b2e_800x493.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!1Mlq!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ba95a8-69c9-49ce-b519-69c8708c8b2e_800x493.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!1Mlq!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ba95a8-69c9-49ce-b519-69c8708c8b2e_800x493.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!1Mlq!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77ba95a8-69c9-49ce-b519-69c8708c8b2e_800x493.jpeg 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Me doing my job without dbt&#8230;</figcaption></figure></div><p>And look at me now. Using dbt daily and telling everyone that &#8220;dbt is amazing.&#8221; The tables have turned. Life has weird ways of teaching us its lessons.</p><p>And by looking at my journey I ask myself one question: what&#8217;s next? Is there a next thing that I need to develop into? Are there new ways of doing my best work and getting satisfaction from it? And I think I found it. At least for myself.</p><p>I call it Full Stack Analytics Engineering.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Full Stack What?</h2><p>Before I dive into the &#8220;Full Stack&#8221; part, I wanted to stop for a moment and recognize what a great name &#8220;analytics engineering&#8221; is. It combines two worlds that previously existed in parallel.</p><p>The &#8220;Analytics&#8221; part is responsible for insights, analysis, and reporting side of data. For a long time, data analysts were doing this job. But good analytics is only possible when it stands on solid ground: functional data infrastructure and defined processes of working with data.</p><p>The &#8220;Engineering&#8221; part is responsible for the technical side of data. Great data infrastructure is only possible with proper planning and thinking about use cases and future scalability and maintainability. Engineering is a world of rules and well-defined processes.</p><p>When combined, a new role emerges. The idea of a data analyst who is not limited by data infrastructure limitations is mind opening. Same as the idea of a data engineer who can go further and be closer to the business. That&#8217;s how you engineer analytics.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!CdAi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef835d52-80db-461a-9821-c91aae7045d2_1693x929.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!CdAi!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef835d52-80db-461a-9821-c91aae7045d2_1693x929.png 424w, /__u/substackcdn.com/image/fetch/$s_!CdAi!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef835d52-80db-461a-9821-c91aae7045d2_1693x929.png 848w, /__u/substackcdn.com/image/fetch/$s_!CdAi!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef835d52-80db-461a-9821-c91aae7045d2_1693x929.png 1272w, /__u/substackcdn.com/image/fetch/$s_!CdAi!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef835d52-80db-461a-9821-c91aae7045d2_1693x929.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!CdAi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef835d52-80db-461a-9821-c91aae7045d2_1693x929.png" width="1456" height="799" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef835d52-80db-461a-9821-c91aae7045d2_1693x929.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:799,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1472809,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/210510591?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef835d52-80db-461a-9821-c91aae7045d2_1693x929.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!CdAi!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef835d52-80db-461a-9821-c91aae7045d2_1693x929.png 424w, /__u/substackcdn.com/image/fetch/$s_!CdAi!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef835d52-80db-461a-9821-c91aae7045d2_1693x929.png 848w, /__u/substackcdn.com/image/fetch/$s_!CdAi!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef835d52-80db-461a-9821-c91aae7045d2_1693x929.png 1272w, /__u/substackcdn.com/image/fetch/$s_!CdAi!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef835d52-80db-461a-9821-c91aae7045d2_1693x929.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It all began with a simple premise: what if we take software engineering best practices and apply them to data? Version control, testing, documentation, CI/CD. And it all worked great! We finally broke out of the vicious cycle of monstrous SQLs and broken dashboards.</p><p>The movement was so empowering that we started to explore adjacent ideas.</p><ul><li><p>We added data ingestion to our toolbelts. Thanks to the modern data stack, adding a new data source is as easy as a few clicks. No more waiting for engineering resources and broken connectors. We can have almost any data we want.</p></li><li><p>We re-discovered data modeling practices. Well, they were never lost, it&#8217;s just that it was very hard to do them without proper tooling and foundational knowledge in the era of data volume and variety explosion. Data analysts barely learn how to model data for analytics, and data engineers are often too busy fighting failing pipelines and building new integrations.</p></li><li><p>We added data observability tools. Finally we can see data dependencies, statistics of failing tests, and track the run time of data pipelines. We better understand how our data stack is performing and where the bottlenecks are.</p></li><li><p>Python, bash, clouds, the list can go on and on&#8230;</p></li></ul><p>Every new responsibility made our analytics more stable, predictable, and trusted. And at the same time, thanks to engineering rigor, we became more confident in our work. No more ad-hoc queries and constant metrics reconciliation.</p><p>It felt like we were settling somewhere.</p><p>But that was until AI happened.</p><h2>The Emergence of AI</h2><p>AI changed the rules of the game dramatically. What was once slow became fast. What was a craft is a commodity now. It feels like the whole class of &#8220;junior&#8221; titles went away.</p><p>Are we doomed? No, we are not. With a catch (as always).</p><p>History is repeating itself. The invention of the printing press made manuscript writers obsolete. Movies with sound made thousands of musician jobs disappear. ATMs eliminated bank tellers. And there are many more similar examples.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!I5ym!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1620f82e-84bf-496b-9c7c-ce553fc5ece4_800x797.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!I5ym!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1620f82e-84bf-496b-9c7c-ce553fc5ece4_800x797.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!I5ym!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1620f82e-84bf-496b-9c7c-ce553fc5ece4_800x797.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!I5ym!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1620f82e-84bf-496b-9c7c-ce553fc5ece4_800x797.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!I5ym!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1620f82e-84bf-496b-9c7c-ce553fc5ece4_800x797.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!I5ym!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1620f82e-84bf-496b-9c7c-ce553fc5ece4_800x797.jpeg" width="366" height="364.6275" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1620f82e-84bf-496b-9c7c-ce553fc5ece4_800x797.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:797,&quot;width&quot;:800,&quot;resizeWidth&quot;:366,&quot;bytes&quot;:130919,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/210510591?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1620f82e-84bf-496b-9c7c-ce553fc5ece4_800x797.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!I5ym!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1620f82e-84bf-496b-9c7c-ce553fc5ece4_800x797.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!I5ym!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1620f82e-84bf-496b-9c7c-ce553fc5ece4_800x797.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!I5ym!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1620f82e-84bf-496b-9c7c-ce553fc5ece4_800x797.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!I5ym!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1620f82e-84bf-496b-9c7c-ce553fc5ece4_800x797.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Who can blame a horse, right?</figcaption></figure></div><p>In each concrete case, the fear is not completely wrong &#8212; many jobs did indeed disappear. But every prediction of mass unemployment has consistently failed as well. And the reason is simple &#8212; people adapted and found new ways to be useful again.</p><p>With the advent of AI, will analytics engineering disappear?</p><p>No, it won&#8217;t. But it will evolve. My take &#8212; it will transform into Full Stack Analytics Engineering.</p><p>Let&#8217;s unbundle this.</p><h2>AE + DE + AI = Full Stack Analytics Engineer</h2><p>First of all, the core responsibilities of analytics engineers are still valuable. That is: knowing SQL, data modeling, data transformation, data quality and documentation, business intelligence.</p><p>But now we can go one level up. A lot of AEs are familiar with data engineering best practices. And again, thanks to modern data products, we can build a full data platform single-handedly: from ingestion, to storage, to transformation, to reverse ETL and BI layer. Analytics engineers now serve across both ends &#8212; backend and frontend of data, if you will.</p><p>Next, the rise of AI allowed us to be more capable. For example, I don&#8217;t remember how to properly ALTER TABLE to add a column, or how to assign a permission role in Snowflake. And I stopped googling these things: a quick prompt and a fast answer let me get on track faster and deliver work faster and more confidently.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!mHLW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7973a11-425a-43ac-80a2-1ba90c228eb7_800x1000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!mHLW!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7973a11-425a-43ac-80a2-1ba90c228eb7_800x1000.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!mHLW!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7973a11-425a-43ac-80a2-1ba90c228eb7_800x1000.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!mHLW!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7973a11-425a-43ac-80a2-1ba90c228eb7_800x1000.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!mHLW!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7973a11-425a-43ac-80a2-1ba90c228eb7_800x1000.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!mHLW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7973a11-425a-43ac-80a2-1ba90c228eb7_800x1000.jpeg" width="328" height="410" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a7973a11-425a-43ac-80a2-1ba90c228eb7_800x1000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1000,&quot;width&quot;:800,&quot;resizeWidth&quot;:328,&quot;bytes&quot;:75188,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/210510591?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7973a11-425a-43ac-80a2-1ba90c228eb7_800x1000.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!mHLW!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7973a11-425a-43ac-80a2-1ba90c228eb7_800x1000.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!mHLW!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7973a11-425a-43ac-80a2-1ba90c228eb7_800x1000.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!mHLW!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7973a11-425a-43ac-80a2-1ba90c228eb7_800x1000.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!mHLW!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7973a11-425a-43ac-80a2-1ba90c228eb7_800x1000.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It means a full stack analytics engineer can work across the stack and deliver a full suite of analytics to the business.</p><p>But what about other roles?</p><h2>Other Roles</h2><p>Does it mean that other roles, such as data analysts and data engineers, are becoming obsolete? The answer is again &#8220;no.&#8221;</p><p>This is similar to full stack software developers. This role didn&#8217;t eliminate front-end engineers and backend engineers. It rather supplemented them by supplying professionals who could support multiple ends, if additional resources are required.</p><p>Same with full stack analytics engineers. They are not replacing other jobs, but rather enhance them with additional expertise.</p><p>In most cases, analytics engineers are ideal first hires when establishing an analytics function in the team. They are capable of building analytics from the ground up and building a great foundation for future roles joining the team.</p><h2>Wait a Minute, But I&#8217;m Not That</h2><p>I hear this fear a lot, especially from junior specialists. Some people prefer to do one job of their liking and live a happy life. But it was the same with bank tellers and manuscript writers. If you don&#8217;t want to learn and adapt, you are out of the job market. Harsh, but true.</p><p>So, how can you ensure that your role is future-proof? For me it&#8217;s a couple of things.</p><p>First, learn the technical fundamentals. SQL and data modeling are still important, even in the era of AI. Explore adjacent fields, because every additional bit of knowledge is always valuable &#8212; though a mentor or a community beats another random YouTube tutorial.</p><p>Second, become proficient with AI. Learn agentic development, create Claude skills, play around with MCPs, set up a proper context layer. Even if we end up delegating analytics engineering to clankers, those skills will still stay with you regardless.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ogOg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe54f756b-9d86-4ac3-a9df-4fea2f4ea64d_800x763.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ogOg!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe54f756b-9d86-4ac3-a9df-4fea2f4ea64d_800x763.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!ogOg!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe54f756b-9d86-4ac3-a9df-4fea2f4ea64d_800x763.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!ogOg!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe54f756b-9d86-4ac3-a9df-4fea2f4ea64d_800x763.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!ogOg!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe54f756b-9d86-4ac3-a9df-4fea2f4ea64d_800x763.jpeg 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ogOg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe54f756b-9d86-4ac3-a9df-4fea2f4ea64d_800x763.jpeg" width="372" height="354.795" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e54f756b-9d86-4ac3-a9df-4fea2f4ea64d_800x763.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:763,&quot;width&quot;:800,&quot;resizeWidth&quot;:372,&quot;bytes&quot;:102199,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/210510591?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe54f756b-9d86-4ac3-a9df-4fea2f4ea64d_800x763.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!ogOg!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe54f756b-9d86-4ac3-a9df-4fea2f4ea64d_800x763.jpeg 424w, /__u/substackcdn.com/image/fetch/$s_!ogOg!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe54f756b-9d86-4ac3-a9df-4fea2f4ea64d_800x763.jpeg 848w, /__u/substackcdn.com/image/fetch/$s_!ogOg!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe54f756b-9d86-4ac3-a9df-4fea2f4ea64d_800x763.jpeg 1272w, /__u/substackcdn.com/image/fetch/$s_!ogOg!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe54f756b-9d86-4ac3-a9df-4fea2f4ea64d_800x763.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And lastly, level up skills that are still not available to AI. Managing projects, gathering requirements, talking to stakeholders, managing people. Learn what is valuable to businesses and try to deliver that. Personal communication and persuasive speaking are exclusive to humans (for now), so take advantage and don&#8217;t think that your technical skills outweigh that.</p><h2>All in All</h2><p>The change is here, no matter if you like it or not. Almost every creative field is endangered by AI and trying to find a solution.</p><p>My solution is simple &#8212; become universal and indispensable while I still can.</p><p>Interesting times.</p><p>Cheers.</p><div><hr></div><p>Subscribe here or <a href="https://www.linkedin.com/in/oleg-agapov/">on LinkedIn</a> to learn more about <strong>analytics engineering </strong>and<strong> AI</strong>!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Og4U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 424w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 848w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Og4U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png" width="415" height="415" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:415,&quot;bytes&quot;:2752273,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/168442302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 424w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 848w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dbtips.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[12 Questions About Analytics Engineering]]></title><description><![CDATA[My honest answers about the role.]]></description><link>https://dbtips.substack.com/p/12-questions-about-analytics-engineering</link><guid isPermaLink="false">https://dbtips.substack.com/p/12-questions-about-analytics-engineering</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Tue, 04 Aug 2026 05:30:54 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ssQN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c1ec83-99d9-4cb6-b967-660d75cffb6b_3840x2160.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ssQN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c1ec83-99d9-4cb6-b967-660d75cffb6b_3840x2160.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ssQN!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c1ec83-99d9-4cb6-b967-660d75cffb6b_3840x2160.png 424w, /__u/substackcdn.com/image/fetch/$s_!ssQN!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c1ec83-99d9-4cb6-b967-660d75cffb6b_3840x2160.png 848w, /__u/substackcdn.com/image/fetch/$s_!ssQN!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c1ec83-99d9-4cb6-b967-660d75cffb6b_3840x2160.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ssQN!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c1ec83-99d9-4cb6-b967-660d75cffb6b_3840x2160.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ssQN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c1ec83-99d9-4cb6-b967-660d75cffb6b_3840x2160.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a4c1ec83-99d9-4cb6-b967-660d75cffb6b_3840x2160.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:280461,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/209710549?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c1ec83-99d9-4cb6-b967-660d75cffb6b_3840x2160.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!ssQN!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c1ec83-99d9-4cb6-b967-660d75cffb6b_3840x2160.png 424w, /__u/substackcdn.com/image/fetch/$s_!ssQN!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c1ec83-99d9-4cb6-b967-660d75cffb6b_3840x2160.png 848w, /__u/substackcdn.com/image/fetch/$s_!ssQN!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c1ec83-99d9-4cb6-b967-660d75cffb6b_3840x2160.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ssQN!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa4c1ec83-99d9-4cb6-b967-660d75cffb6b_3840x2160.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A follower sent me these questions in a DM a few weeks ago. All about moving from data analyst to analytics engineer, and everything that comes with it.</p><p>I don&#8217;t usually get the chance to answer questions like this in full, so I wrote it all out here instead of a short DM reply. If you&#8217;re an analyst thinking about the same move, or already doing this job and curious how someone else sees it, hopefully something in here is useful.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2></h2><h3>&#8220;You started as an Analyst and transitioned to Analytics Engineering. What motivated that transition?&#8221;</h3><p>&#9889;&#65039; I worked as a data analyst for about 8 years and in every job I had difficulties that followed me everywhere: excel reports needs to be updated manually, every data export was an exploration journey, two different dashboards had different numbers, and most annoying question was when stakeholders &#8220;are you sure this number is correct?&#8221;. For a long time I blamed myself and the quality of my work, e.g. I had to be more careful, I had to check the query, I had to perform more thorough analysis and so on. But the problem wasn&#8217;t with my skill. The problem was the inefficient process of building the analytical foundation.</p><p>Around 2020 I started looking into data engineering. And it was a field that followed a strong engineering rigor: code best practices, automations, curated datasets, proper data modeling. It felt all correct, but was overwhelming at time. The shift from data analysis to data engineering felt massive. And this is where I found out about dbt and analytics engineering.</p><p>This new title had best of both worlds: practical analytics and engineering best practices. And the more I learned about the role and the dbt framework, the more I was convinced that AE is something that I want to do: build scalable analytics and be useful to the business.</p><h3>&#8220;Was there a particular project or experience that helped you get your first Analytics Engineer role?&#8221;</h3><p>&#9889;&#65039; Yes, there was a particular project that helped me transition to the AE role which could greatly demonstrate my desire to switch to AE full time.</p><p>At the time I was working as BI engineer working with Looker. If you are not familiar, Looker is a BI tool with the built-in semantic layer. And I&#8217;ve got a big project to work on: implement a Metrics overview dashboard for Monthly Board meetings. It was a great opportunity to structure the business metrics on a single canvas and showcase my ability to deliver quality data product.</p><p>At first I was excited about the project and quickly build a first prototype with a couple of first main KPIs. However, the more I worked on the dashboard, the more I realized that our data was a mess. Some datasets missed needed dimensions. Some metrics definitions were scattered across multiple dashboards. Some data transformations were done in the data warehouse, but some in the looker&#8217;s transformation tool. It was really hard and time consuming to find proper ways of delivering the project.</p><p>At the same time, our data platform engineers introduced dbt to our stack. So knowing about the best practices of using the correct tool for job, I&#8217;ve decided to implement all data marts in dbt, and use Looker only for visualization and complex metrics definitions.</p><p>And it worked very well! Using SQL I was able to create datasets that included all necessary dimensions and measures, add data tests and document every single column and source I used for it. Using those clean and analytics-ready datasets I was able to quickly rework the dashboard and deliver a clean and tested metrics to the Board.</p><h3>&#8220;Looking back, what were the biggest skill gaps you had to bridge?&#8221;</h3><p>&#9889;&#65039; My two main skill gaps were data modeling and requirement gathering.</p><p>Working as data analyst I rarely thought about scalability and reusability of my datasets. Often my queries were just one-off scripts that took a lot of time, but gave almost no practical value for the future reuse. I lacked proper data modeling practice.</p><p>Another gap was a proper requirement gathering from stakeholders. When all my work looked like an endless ad-hoc cycle, there was no time for me to proper think about all edge-cases or further application of my solution. That led to re-work and back-and-forth with the business people whose real desire wasn&#8217;t satisfied with the numbers that I provided.</p><h3>&#8220;What does a typical week look like for you?&#8221;</h3><p>&#9889;&#65039; My typical week is a combination of multiple types of work.</p><p>First type of work is individual contribution. It is a meaningful time for working on my tasks and writing code. This usually includes writing new data models for new product features and creating dashboard and semantic layer for those new models.</p><p>Second type of work is data maintenance. This includes fixing broken tests, implementing changes to the models according to changes in the business, helping with incoming data questions from stakeholders, fixing outdated dashboards and efforts to keep our data code clean and pristine.</p><p>Lastly, I spend time on meetings and mentoring. Meeting could be syncs with the team, cross-functional syncs and aligning on the roadmap. Additionally we spend some time on mentoring and self-education. For example, in my team we run BI office hours, where everyone can come and ask question about building a dashboard, metric definition or any blockers they experience with the dashboards. Sometimes we also spend time with the team going for workshops, doing internal trainings or participating in hackathons.</p><h3>&#8220;Roughly, what's the tool or thing that takes up most of your time?&#8221;</h3><p>&#9889;&#65039; My answer to that question would be very different a year ago, but now it&#8217;s definitely an AI. With the advent of strong models and new ways of collaborating with AI, my new everyday tool is Claude Code and Codex. They now automate a big chunk of my work, leaving me with the work that cannot be automated (yet).</p><p>Also, I&#8217;m trying to learn and experiment with the latest developments in this field. Because it&#8217;s a fast growing topic that can really elevate my career, so skipping it may cost me a lot.</p><h3>&#8220;Must have skills for beginners/data analyst trying to transition or looking for analytical engineering role?&#8221;</h3><p>&#9889;&#65039; Here are skills that I believe are important today:</p><ul><li><p>SQL &#8212; daily tool to manipulate the data. Still valuable, even in the AI era</p></li><li><p>dbt &#8212; the most popular framework for data transformation lifecycle</p></li><li><p>Data Modeling &#8212; learn how to build scalable and maintainable datasets</p></li><li><p>Claude Code or Codex &#8212; hot new skills that are becoming must have</p></li><li><p>Collaboration with stakeholders &#8212; learn to ask question, clarify requirements, follow up on projects and be a great data partner</p></li></ul><h3>&#8220;How deep does someone really need to know Python?&#8221;</h3><p>&#9889;&#65039; Although the classic AE role doesn&#8217;t require Python, I&#8217;d suggest to know at least basics of Python to be more valuable as a specialist.</p><p>A lot of companies today have blurred lines in responsibilities between data engineers, analytics engineers and data analysts. It means that sometimes you may need to read and write Python to be on the same page with the team. For example, you may need to understand how the data is gathered and transformed in Apache Airflow. Or you may need to read Pandas data transformations created by analysts in order to translate them to SQL.</p><p>Obviously, with the AI you can ask it to do the job, but you still need a way to verify the output. So it would be good to not only rely on the AI, but also be able to apply your own judgment.</p><h3>&#8220;Which dbt concepts you use often?&#8221;</h3><p>&#9889;&#65039; Well, dbt has a lot of concepts and they all applicable in different situations. So there is no list of my favourite or most used concepts. But I like to think about this from a different angle.</p><p>dbt provides you a suit of tools that you should know and use:</p><ul><li><p>Transformations &#8212; the core feature. Learn about refs and source macros, materializations, model configs.</p></li><li><p>Testing &#8212; almost on the same level of importance as transformations. Learn about data tests, custom SQL tests, unit testing.</p></li><li><p>Documentation &#8212; becoming especially important in the AI age, because agents can get additional context from documented dbt models and column</p></li><li><p>Advanced features &#8212; stuff that pushes your project to maximum efficiency: variables, macros, packages, observability</p></li></ul><h3>&#8220;If you interviewed me, what portfolio project would immediately make you think, &#8220;This person understands Analytics Engineering&#8221;?&#8221;</h3><p>&#9889;&#65039; As an interviewer, I rarely look at portfolios. But it doesn&#8217;t mean they are not useful. Because they are needed for you, not for the interviewer.</p><p>Portfolios can be good for practicing project architecture, data modeling, and data storytelling. At the interview I&#8217;m usually less interested about technical advancements you worked on, but more interested on how you tell me the story of the project. What insights you found, what data supports that, what are your recommendation to the business.</p><p>A person who understands Analytics engineering can tell a great data story without showing a single line of code.</p><h3>&#8220;What are the top and most important interview questions that candidates struggle with? And what makes a candidate stand out?&#8221;</h3><p>&#9889;&#65039; When I ask &#8220;tell me about your past experience&#8221; many candidates start to explain the technical stacks and frameworks they worked with. But I want to hear what they achieved: were there clear business requirements, how this person clarified them, how the outcome helped the business.</p><p>Candidates who start with the business outcome are usually stand out more than those who start with the code and technical talks.</p><h3>&#8220;If I have to learn skills important for this role, what would you recommend should be at the top?&#8221;</h3><p>&#9889;&#65039; I&#8217;d say two: data modeling and AI. Both are now essential to the role, and both can differentiate good analytics engineer from a great one.</p><h3>&#8220;Lastly, what are some best practices you follow for documenting data models?&#8221;</h3><p>&#9889;&#65039; I have a couple of rules regarding data documentation:</p><ol><li><p>Document everything for both humans and AI. You most definitely won&#8217;t remember why you applied a specific logic in your code unless you explicitly point that in the docs. Also, as I mentioned earlier, AI agents can extract useful context from data docs, so don&#8217;t skip that.</p></li><li><p>Another form of documenting models is adding useful comments. Don&#8217;t explain what the code is doing, explain the why behind it. It could be again a specific business logic, or gaps in the data.</p></li><li><p>Finally, always document the staging layer (input), marts layer (output) and every new business logic that gets generated in the intermediate layer.</p></li></ol><p></p><h2>Summary</h2><p>If you're an analyst thinking about this move, most of what's holding you back probably isn't the tools. It's deciding to actually start. So just start, and probably one day I&#8217;ll learn something useful from you :)</p><p>If you liked the post, give it a heart and share with a colleagues.</p><p>Subscribe here or <a href="https://www.linkedin.com/in/oleg-agapov/">on LinkedIn</a> to learn more about <strong>analytics engineering </strong>and<strong> AI</strong>!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Og4U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 424w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 848w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Og4U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png" width="415" height="415" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:415,&quot;bytes&quot;:2752273,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/168442302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 424w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 848w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dbtips.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[How to Prepare for an Analytics Engineering Interview]]></title><description><![CDATA[A practical guide from HR screen to final round]]></description><link>https://dbtips.substack.com/p/how-to-prepare-for-an-analytics-engineering</link><guid isPermaLink="false">https://dbtips.substack.com/p/how-to-prepare-for-an-analytics-engineering</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Mon, 12 Jan 2026 03:36:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!aBhO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d5e91b3-b144-4efb-a5e6-1f41e0296e27_5760x3240.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!aBhO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d5e91b3-b144-4efb-a5e6-1f41e0296e27_5760x3240.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!aBhO!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d5e91b3-b144-4efb-a5e6-1f41e0296e27_5760x3240.png 424w, /__u/substackcdn.com/image/fetch/$s_!aBhO!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d5e91b3-b144-4efb-a5e6-1f41e0296e27_5760x3240.png 848w, /__u/substackcdn.com/image/fetch/$s_!aBhO!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d5e91b3-b144-4efb-a5e6-1f41e0296e27_5760x3240.png 1272w, /__u/substackcdn.com/image/fetch/$s_!aBhO!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d5e91b3-b144-4efb-a5e6-1f41e0296e27_5760x3240.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!aBhO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d5e91b3-b144-4efb-a5e6-1f41e0296e27_5760x3240.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d5e91b3-b144-4efb-a5e6-1f41e0296e27_5760x3240.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:349660,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/183876418?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d5e91b3-b144-4efb-a5e6-1f41e0296e27_5760x3240.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!aBhO!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d5e91b3-b144-4efb-a5e6-1f41e0296e27_5760x3240.png 424w, /__u/substackcdn.com/image/fetch/$s_!aBhO!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d5e91b3-b144-4efb-a5e6-1f41e0296e27_5760x3240.png 848w, /__u/substackcdn.com/image/fetch/$s_!aBhO!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d5e91b3-b144-4efb-a5e6-1f41e0296e27_5760x3240.png 1272w, /__u/substackcdn.com/image/fetch/$s_!aBhO!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d5e91b3-b144-4efb-a5e6-1f41e0296e27_5760x3240.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Recently, I <a href="https://www.linkedin.com/posts/oleg-agapov_im-currently-working-on-a-new-course-called-activity-7407453364164145152-yBBP">asked my followers</a> on LinkedIn:</p><p><strong>&#8220;Which part of the interview process feels the hardest?&#8221;</strong></p><p>Here are the top three answers:</p><ul><li><p><strong>Data modeling</strong> (65%)</p></li><li><p><strong>Technical round</strong> (49%)</p></li><li><p><strong>I&#8217;m not sure what companies expect</strong> (32%)</p></li></ul><p>The first two are fairly obvious. Technical expertise is the foundation of any analytics engineering interview, and data modeling is increasingly becoming a core skill (something Joe Reis has been actively advocating for).</p><p>What surprised me most, though, is that nearly 33% of candidates don&#8217;t know what companies are actually evaluating. On top of that, almost 54% said they&#8217;ve failed at least one interview.</p><p>So let&#8217;s break down how companies hire analytics engineers and how you can prepare for each step!</p><p><strong>Update (May 2026)</strong>. I released a book about preparing for AE interview!</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!6-JY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8c1a0d-f35b-4466-8a17-df2fcd40915b_2508x627.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!6-JY!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8c1a0d-f35b-4466-8a17-df2fcd40915b_2508x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!6-JY!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8c1a0d-f35b-4466-8a17-df2fcd40915b_2508x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!6-JY!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8c1a0d-f35b-4466-8a17-df2fcd40915b_2508x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6-JY!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8c1a0d-f35b-4466-8a17-df2fcd40915b_2508x627.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!6-JY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8c1a0d-f35b-4466-8a17-df2fcd40915b_2508x627.png" width="1456" height="364" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a8c1a0d-f35b-4466-8a17-df2fcd40915b_2508x627.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:364,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1321182,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/183876418?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8c1a0d-f35b-4466-8a17-df2fcd40915b_2508x627.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!6-JY!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8c1a0d-f35b-4466-8a17-df2fcd40915b_2508x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!6-JY!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8c1a0d-f35b-4466-8a17-df2fcd40915b_2508x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!6-JY!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8c1a0d-f35b-4466-8a17-df2fcd40915b_2508x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6-JY!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8c1a0d-f35b-4466-8a17-df2fcd40915b_2508x627.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Check it <a href="https://olegagapov.gumroad.com/l/cracking-the-analytics-engineering-interview">on Gumroad</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h2>The interview process</h2><p>Before diving into specific rounds, it&#8217;s important to understand one thing:</p><blockquote><p>There is no single, objective measure of how well you performed in an interview.</p></blockquote><p>Interview outcomes are inherently subjective and depend on the interviewer, the company, and the role. However, most interviewers assess candidates across a similar set of dimensions:</p><ul><li><p><strong>Analytical skills</strong> &#8212; how you approach problems, talk about trade-offs, and structure your solutions</p></li><li><p><strong>Technical knowledge</strong> &#8212; your foundation in SQL, data modeling, and transformation tools</p></li><li><p><strong>Relevant experience</strong> &#8212; how closely your past work maps to their problems</p></li><li><p><strong>Communication skills</strong> &#8212; clarity, structure, and ability to explain ideas</p></li><li><p><strong>Culture fit</strong> &#8212; how well you align with the team and company values</p></li></ul><p>You don&#8217;t need to be exceptional in all of these, but the stronger you are across the board, the better your chances.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!gPYY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a269ac8-f6dc-46dd-abc7-15ff249ed955_5396x2034.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!gPYY!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a269ac8-f6dc-46dd-abc7-15ff249ed955_5396x2034.png 424w, /__u/substackcdn.com/image/fetch/$s_!gPYY!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a269ac8-f6dc-46dd-abc7-15ff249ed955_5396x2034.png 848w, /__u/substackcdn.com/image/fetch/$s_!gPYY!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a269ac8-f6dc-46dd-abc7-15ff249ed955_5396x2034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!gPYY!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a269ac8-f6dc-46dd-abc7-15ff249ed955_5396x2034.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!gPYY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a269ac8-f6dc-46dd-abc7-15ff249ed955_5396x2034.png" width="1456" height="549" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a269ac8-f6dc-46dd-abc7-15ff249ed955_5396x2034.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:549,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:94368,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/183876418?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a269ac8-f6dc-46dd-abc7-15ff249ed955_5396x2034.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!gPYY!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a269ac8-f6dc-46dd-abc7-15ff249ed955_5396x2034.png 424w, /__u/substackcdn.com/image/fetch/$s_!gPYY!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a269ac8-f6dc-46dd-abc7-15ff249ed955_5396x2034.png 848w, /__u/substackcdn.com/image/fetch/$s_!gPYY!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a269ac8-f6dc-46dd-abc7-15ff249ed955_5396x2034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!gPYY!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a269ac8-f6dc-46dd-abc7-15ff249ed955_5396x2034.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>To evaluate these dimensions, most companies use a multi-step interview process. Each company may have their own way of structuring the interview, but it usually includes some combination of the following four rounds:</p><ol><li><p>Recruiter screen</p></li><li><p>Technical round</p></li><li><p>Take-home assignment</p></li><li><p>Stakeholder / final round</p></li></ol><p>Not every company may use all four, but I&#8217;ve seen those patterns quite a few times.</p><h4>The funnel reality </h4><p>The funnel can be brutal. A typical analytics engineering role may receive <strong>100+ applications</strong>:</p><ul><li><p>20&#8211;40 candidates pass the recruiter screen</p></li><li><p>10&#8211;20 reach the technical and take-home stages</p></li><li><p>2&#8211;5 make it to the final round</p></li><li><p><strong>1 receives an offer</strong></p></li></ul><p>That&#8217;s the reality of the current market.</p><p>Let&#8217;s walk through each stage and what interviewers look for.</p><h2>Recruiter/HR screening</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!B2bC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4b789-fc01-42e9-bf5f-f2935a119533_5396x2034.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!B2bC!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4b789-fc01-42e9-bf5f-f2935a119533_5396x2034.png 424w, /__u/substackcdn.com/image/fetch/$s_!B2bC!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4b789-fc01-42e9-bf5f-f2935a119533_5396x2034.png 848w, /__u/substackcdn.com/image/fetch/$s_!B2bC!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4b789-fc01-42e9-bf5f-f2935a119533_5396x2034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!B2bC!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4b789-fc01-42e9-bf5f-f2935a119533_5396x2034.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!B2bC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4b789-fc01-42e9-bf5f-f2935a119533_5396x2034.png" width="1456" height="549" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2ea4b789-fc01-42e9-bf5f-f2935a119533_5396x2034.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:549,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:97579,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/183876418?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4b789-fc01-42e9-bf5f-f2935a119533_5396x2034.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!B2bC!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4b789-fc01-42e9-bf5f-f2935a119533_5396x2034.png 424w, /__u/substackcdn.com/image/fetch/$s_!B2bC!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4b789-fc01-42e9-bf5f-f2935a119533_5396x2034.png 848w, /__u/substackcdn.com/image/fetch/$s_!B2bC!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4b789-fc01-42e9-bf5f-f2935a119533_5396x2034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!B2bC!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2ea4b789-fc01-42e9-bf5f-f2935a119533_5396x2034.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The recruiter (or HR) screen is usually a <strong>20&#8211;30 minute call</strong> designed to answer two questions:</p><ol><li><p>Should we keep investing time in this candidate?</p></li><li><p>Are we aligned on logistics (salary, conditions, etc)?</p></li></ol><p>Typical questions include:</p><p><strong>&#8220;Tell me about your background&#8221;</strong></p><p>Focus on your current role, scope, tech stack, and why you work as an analytics engineer.</p><p><strong>&#8220;Why do you want to work here?&#8221;</strong></p><p>Talk about the product, domain, team, or growth opportunities.<br>Avoid speaking negatively about your current company &#8212; that&#8217;s a common red flag.</p><p><strong>&#8220;Have you used X?&#8221;</strong></p><p>Questions about SQL, dbt, orchestration tools, or analytics platforms.</p><p><strong>Logistics</strong></p><p>Salary expectations, start date, work authorization, location, etc.</p><p><strong>&#8220;Do you have any questions for me?&#8221;</strong></p><p>This matters more than people think. Good questions signal seniority and reduce the risk of mismatch.</p><p><strong>Preparation tips:</strong></p><ul><li><p>Prepare concise answers (1&#8211;2 minutes each)</p></li><li><p>Avoid heavy technical jargon &#8212; recruiters are usually non-technical</p></li><li><p>Prepare thoughtful questions about responsibilities, impact, and success criteria</p></li></ul><p>Finally, make sure the role is actually a good fit. Job descriptions can be vague or overloaded with non-AE responsibilities. To align the job description with the role, check out my article about <a href="/__u/dbtips.substack.com/p/what-analytics-engineers-actually">the role of analytics engineer</a> where I talk about responsibilities and skills.</p><h2>Technical round</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!TKrv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe40ce6e1-3c0e-4cd0-92b1-578c7ceef55d_5396x2034.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!TKrv!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe40ce6e1-3c0e-4cd0-92b1-578c7ceef55d_5396x2034.png 424w, /__u/substackcdn.com/image/fetch/$s_!TKrv!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe40ce6e1-3c0e-4cd0-92b1-578c7ceef55d_5396x2034.png 848w, /__u/substackcdn.com/image/fetch/$s_!TKrv!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe40ce6e1-3c0e-4cd0-92b1-578c7ceef55d_5396x2034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!TKrv!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe40ce6e1-3c0e-4cd0-92b1-578c7ceef55d_5396x2034.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!TKrv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe40ce6e1-3c0e-4cd0-92b1-578c7ceef55d_5396x2034.png" width="1456" height="549" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e40ce6e1-3c0e-4cd0-92b1-578c7ceef55d_5396x2034.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:549,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:72649,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/183876418?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe40ce6e1-3c0e-4cd0-92b1-578c7ceef55d_5396x2034.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!TKrv!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe40ce6e1-3c0e-4cd0-92b1-578c7ceef55d_5396x2034.png 424w, /__u/substackcdn.com/image/fetch/$s_!TKrv!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe40ce6e1-3c0e-4cd0-92b1-578c7ceef55d_5396x2034.png 848w, /__u/substackcdn.com/image/fetch/$s_!TKrv!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe40ce6e1-3c0e-4cd0-92b1-578c7ceef55d_5396x2034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!TKrv!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe40ce6e1-3c0e-4cd0-92b1-578c7ceef55d_5396x2034.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This round evaluates your technical foundation. The better you perform here, the higher your chances of moving forward and getting the offer.</p><h4>SQL skills</h4><p>SQL is a hard requirement. If you fail here, you won&#8217;t pass the round.</p><p>You&#8217;ll usually see two formats:</p><p>1. Conceptual questions</p><ul><li><p>Difference between <code>UNION</code> and <code>UNION ALL</code></p></li><li><p>Types of joins and when to use them</p></li><li><p>Window functions and common use cases</p></li><li><p>How to debug a slow query</p></li></ul><p>2. Live coding / whiteboarding</p><ul><li><p>You&#8217;re given a schema or dataset</p></li><li><p>You answer business questions using SQL</p></li><li><p>You&#8217;re expected to ask clarifying questions</p></li></ul><p>You can practice with curated SQL problem sets (e.g. <a href="https://leetcode.com/studyplan/leetcode-75/">LeetCode SQL</a> tracks) or even better &#8212; mock interviews with another person.</p><h4>Data modeling</h4><p>Data modeling questions are core to analytics engineering interviews. Interviewers want to see whether you can:</p><ul><li><p>Define business entities (users, orders, sessions, subscriptions)</p></li><li><p>Choose the correct grain and primary keys</p></li><li><p>Separate facts and dimensions</p></li><li><p>Handle slowly changing attributes</p></li><li><p>Design models that work well for BI and analytics</p></li></ul><p>Typical prompts include:</p><ul><li><p>&#8220;Design an e-commerce analytics data mart&#8221;</p></li><li><p>&#8220;Model subscriptions with upgrades, downgrades, and churn&#8221;</p></li><li><p>&#8220;How would you build reporting tables from events, orders, and marketing spend?&#8221;</p></li><li><p>&#8220;How would you model MRR or retention?&#8221;</p></li></ul><h4>dbt / transformation workflows</h4><p>Even if the company doesn&#8217;t use dbt explicitly, they test the same concepts:</p><ul><li><p>Layered modeling (staging &#8594; intermediate &#8594; marts)</p></li><li><p>Testing (uniqueness, not null, relationships, accepted values)</p></li><li><p>Incremental models</p></li><li><p>Documentation and its importance</p></li><li><p>Debugging broken models or failing tests</p></li></ul><p>The technical round usually lasts <strong>1&#8211;2 hours</strong> and combines SQL, data modeling, and transformation questions.</p><h2>Take-home assignment</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!iuJw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4458366e-af32-4922-82d7-3857898d7490_5396x2034.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!iuJw!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4458366e-af32-4922-82d7-3857898d7490_5396x2034.png 424w, /__u/substackcdn.com/image/fetch/$s_!iuJw!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4458366e-af32-4922-82d7-3857898d7490_5396x2034.png 848w, /__u/substackcdn.com/image/fetch/$s_!iuJw!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4458366e-af32-4922-82d7-3857898d7490_5396x2034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!iuJw!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4458366e-af32-4922-82d7-3857898d7490_5396x2034.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!iuJw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4458366e-af32-4922-82d7-3857898d7490_5396x2034.png" width="1456" height="549" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4458366e-af32-4922-82d7-3857898d7490_5396x2034.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:549,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:57048,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/183876418?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4458366e-af32-4922-82d7-3857898d7490_5396x2034.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!iuJw!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4458366e-af32-4922-82d7-3857898d7490_5396x2034.png 424w, /__u/substackcdn.com/image/fetch/$s_!iuJw!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4458366e-af32-4922-82d7-3857898d7490_5396x2034.png 848w, /__u/substackcdn.com/image/fetch/$s_!iuJw!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4458366e-af32-4922-82d7-3857898d7490_5396x2034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!iuJw!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4458366e-af32-4922-82d7-3857898d7490_5396x2034.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The take-home assignment tests how well you apply your skills in practice.</p><p>You&#8217;re typically given:</p><ul><li><p>A mock dataset</p></li><li><p>A realistic but scoped business problem</p></li></ul><p>A well-designed assignment should take <strong>~3 hours</strong>.</p><p>For example, in a gaming company, you might be asked to model telemetry data (players, sessions, matches, transactions) and help the Product team understand engagement, retention, and monetization.</p><p>Some assignments are very explicit about outputs. Others are intentionally vague &#8212; part of the test is deciding <em>what</em> to measure.</p><p>You&#8217;ll usually be evaluated on:</p><ul><li><p><strong>Correctness</strong> &#8212; are your metrics and conclusions sound?</p></li><li><p><strong>Data modeling</strong> &#8212; structure, naming, conventions</p></li><li><p><strong>Data quality</strong> &#8212; tests, validation, deduplication</p></li><li><p><strong>Communication</strong> &#8212; README, explanations, storytelling</p></li><li><p><strong>Engineering judgment</strong> &#8212; maintainability and scalability</p></li></ul><p>Clean, well-explained solutions almost always beat over-engineered ones.</p><h2>Stakeholders/final round</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!KVsc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5d3978a-1d7d-446c-9701-7baefd5e9d3b_5396x2034.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!KVsc!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5d3978a-1d7d-446c-9701-7baefd5e9d3b_5396x2034.png 424w, /__u/substackcdn.com/image/fetch/$s_!KVsc!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5d3978a-1d7d-446c-9701-7baefd5e9d3b_5396x2034.png 848w, /__u/substackcdn.com/image/fetch/$s_!KVsc!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5d3978a-1d7d-446c-9701-7baefd5e9d3b_5396x2034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!KVsc!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5d3978a-1d7d-446c-9701-7baefd5e9d3b_5396x2034.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!KVsc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5d3978a-1d7d-446c-9701-7baefd5e9d3b_5396x2034.png" width="1456" height="549" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d5d3978a-1d7d-446c-9701-7baefd5e9d3b_5396x2034.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:549,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:222164,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/183876418?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5d3978a-1d7d-446c-9701-7baefd5e9d3b_5396x2034.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!KVsc!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5d3978a-1d7d-446c-9701-7baefd5e9d3b_5396x2034.png 424w, /__u/substackcdn.com/image/fetch/$s_!KVsc!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5d3978a-1d7d-446c-9701-7baefd5e9d3b_5396x2034.png 848w, /__u/substackcdn.com/image/fetch/$s_!KVsc!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5d3978a-1d7d-446c-9701-7baefd5e9d3b_5396x2034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!KVsc!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5d3978a-1d7d-446c-9701-7baefd5e9d3b_5396x2034.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This round evaluates whether you can <strong>turn messy business context into a clear analytics plan</strong>. It usually feels more like a working session with a Product Manager or Head of Data than a test.</p><p>Common themes:</p><ul><li><p>&#8220;<strong>Tell me about a project</strong> &#8230;&#8221; &#8212; it could be a real or fictional case, where you&#8217;d have to talk about aligning with business stakeholders, clarifying requirements, reasoning trade-offs and driving the adoption of the project </p></li><li><p><strong>Metric definition and investigation</strong></p><ul><li><p>&#8220;How would you investigate a metric drop?&#8221;</p></li><li><p>&#8220;Define a metric of success for a feature X&#8221;</p></li></ul></li><li><p><strong>Stakeholder communication and pushback</strong></p><ul><li><p>&#8220;How do you handle a stakeholder who wants a metric ASAP?&#8221;</p></li><li><p>&#8220;How do you push back when a request doesn&#8217;t make sense?&#8221;</p></li></ul></li><li><p><strong>Data trust, governance, and consistency</strong></p><ul><li><p>&#8220;How do you ensure metrics are consistent across teams?&#8221;</p></li><li><p>&#8220;How do you ensure data quality?&#8221;</p></li></ul></li></ul><p>While listening to your answers, interviewers implicitly assessing:</p><ul><li><p>Do you communicate clearly?</p></li><li><p>Do you show clarity and ownership?</p></li><li><p>Are you a pragmatic or perfectionist?</p></li><li><p>How you deal with uncertainty and pressure?</p></li><li><p>Whether you&#8217;ll escalate issues early or quietly struggle?</p></li></ul><p>To sum up, in the stakeholder round, companies are checking whether you can clarify the decision, align on metric definitions, communicate tradeoffs, and end with a concrete recommendation. Red flags are jumping into SQL, being vague about definitions, and failing to tie your work to adoption and impact.</p><h2>Final words</h2><p>Preparing for an analytics engineering interview is a lot of work. And I hope my article helped you to understand what companies are actually looking for &#8212; and how to prepare intentionally for each stage.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://payhip.com/b/h5e7f&quot;,&quot;text&quot;:&quot;Check bootcamp&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://payhip.com/b/h5e7f"><span>Check bootcamp</span></a></p><p>Subscribe here and follow <a href="https://www.linkedin.com/in/oleg-agapov/">on LinkedIn</a> to learn more about analytics engineering!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Og4U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 424w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 848w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Og4U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png" width="415" height="415" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:415,&quot;bytes&quot;:2752273,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/168442302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 424w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 848w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dbtips.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[What Analytics Engineers Actually Do?]]></title><description><![CDATA[A simple guide to the role, the skills, and the boundaries that matter.]]></description><link>https://dbtips.substack.com/p/what-analytics-engineers-actually</link><guid isPermaLink="false">https://dbtips.substack.com/p/what-analytics-engineers-actually</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Mon, 08 Dec 2025 04:43:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!hZp-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2d3031c-4fa3-4220-a87b-dfb2cba6c420_5760x3240.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!hZp-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2d3031c-4fa3-4220-a87b-dfb2cba6c420_5760x3240.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!hZp-!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2d3031c-4fa3-4220-a87b-dfb2cba6c420_5760x3240.png 424w, /__u/substackcdn.com/image/fetch/$s_!hZp-!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2d3031c-4fa3-4220-a87b-dfb2cba6c420_5760x3240.png 848w, /__u/substackcdn.com/image/fetch/$s_!hZp-!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2d3031c-4fa3-4220-a87b-dfb2cba6c420_5760x3240.png 1272w, /__u/substackcdn.com/image/fetch/$s_!hZp-!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2d3031c-4fa3-4220-a87b-dfb2cba6c420_5760x3240.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!hZp-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2d3031c-4fa3-4220-a87b-dfb2cba6c420_5760x3240.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b2d3031c-4fa3-4220-a87b-dfb2cba6c420_5760x3240.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:224181,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/180374199?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2d3031c-4fa3-4220-a87b-dfb2cba6c420_5760x3240.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!hZp-!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2d3031c-4fa3-4220-a87b-dfb2cba6c420_5760x3240.png 424w, /__u/substackcdn.com/image/fetch/$s_!hZp-!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2d3031c-4fa3-4220-a87b-dfb2cba6c420_5760x3240.png 848w, /__u/substackcdn.com/image/fetch/$s_!hZp-!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2d3031c-4fa3-4220-a87b-dfb2cba6c420_5760x3240.png 1272w, /__u/substackcdn.com/image/fetch/$s_!hZp-!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2d3031c-4fa3-4220-a87b-dfb2cba6c420_5760x3240.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A few weeks ago, I <a href="https://www.linkedin.com/posts/oleg-agapov_youre-not-hiring-an-analytics-engineer-activity-7389318853094412288-uzeS/?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAABcpLlcBzUuWt03kkkljlxN_PSPPey2FB-k">stumbled on a job posting</a> for an <em>Analytics Engineer</em> position that left me frustrated. The company wanted everything at once: machine learning, statistics, data structures and algoritms &#8212; basically an entire data team packed into one person.</p><p>You&#8217;ve probably seen job posts like that too. Maybe you even wondered if <em>you&#8217;re</em> the one missing something. That moment pushed me to write this article.</p><p>My goal is to clearly explain what analytics engineers actually do, and what they <em>shouldn&#8217;t</em> be responsible for. Because when everyone, companies and candidates, understands the role, both benefit.</p><p>So let&#8217;s figure this out together!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h3>&#128119; The Role of an Analytics Engineer</h3><p>One way to understand what analytics engineers do is to compare them with the other roles on a modern data team.</p><p>Analytics engineering sits right in the middle, between <strong>data engineering</strong> and <strong>data analysis</strong>, and connects the technical side of data with the business side.</p><p>Let&#8217;s quickly look at each role:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!q68d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fba8d5-5305-433f-9e8b-55e58d6c86da_4576x2496.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!q68d!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fba8d5-5305-433f-9e8b-55e58d6c86da_4576x2496.png 424w, /__u/substackcdn.com/image/fetch/$s_!q68d!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fba8d5-5305-433f-9e8b-55e58d6c86da_4576x2496.png 848w, /__u/substackcdn.com/image/fetch/$s_!q68d!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fba8d5-5305-433f-9e8b-55e58d6c86da_4576x2496.png 1272w, /__u/substackcdn.com/image/fetch/$s_!q68d!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fba8d5-5305-433f-9e8b-55e58d6c86da_4576x2496.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!q68d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fba8d5-5305-433f-9e8b-55e58d6c86da_4576x2496.png" width="1456" height="794" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70fba8d5-5305-433f-9e8b-55e58d6c86da_4576x2496.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:794,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:206169,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/180374199?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fba8d5-5305-433f-9e8b-55e58d6c86da_4576x2496.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!q68d!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fba8d5-5305-433f-9e8b-55e58d6c86da_4576x2496.png 424w, /__u/substackcdn.com/image/fetch/$s_!q68d!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fba8d5-5305-433f-9e8b-55e58d6c86da_4576x2496.png 848w, /__u/substackcdn.com/image/fetch/$s_!q68d!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fba8d5-5305-433f-9e8b-55e58d6c86da_4576x2496.png 1272w, /__u/substackcdn.com/image/fetch/$s_!q68d!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70fba8d5-5305-433f-9e8b-55e58d6c86da_4576x2496.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As you can see, analytics engineers bridge the gap between both sides. Data engineers are often deep in the technical stack, and data analysts are often deep in the business context. Analytics engineers understand <em>enough of both</em> to enable fast, reliable, self-serve analytics.</p><p>Another key trait of analytics engineers is their ability to bring <strong>software engineering best practices</strong> into the analytics world:</p><ul><li><p>version control</p></li><li><p>automated data testing</p></li><li><p>isolated development environments</p></li><li><p>continuous integration and delivery (CI/CD)</p></li></ul><p>and so on.</p><p>This combination of engineering mindset + business collaboration gives analytics engineers a uniquely strong understanding of what the business <em>actually needs</em> and how <em>data should be structured</em> to support that.</p><p>Of course, in real life the lines between roles aren&#8217;t perfectly clean. Some analytics engineers work closer to the tech side (ingestion layer and pipelines). Others spend more time on analysis and BI tooling.</p><p>But regardless of the specifics, <strong>the core mission stays the same</strong>:</p><blockquote><p>Turn raw, messy data into clean, reliable, useful datasets &#8212; so the business can focus on insights, not on hunting for data.</p></blockquote><h2>&#128736;&#65039; Responsibilities and Skills</h2><p>The responsibilities of analytics engineers are a common source of debate &#8212; mostly because not everyone fully understands where the role begins and ends. Some people confuse analytics engineers with data engineers. Others expect them to act like advanced data analysts. Many hiring managers simply don&#8217;t have a clear mental model of the role.</p><p>This misunderstanding hurts both sides.</p><p><em>Companies</em> end up filtering through tons of irrelevant applications.</p><p><em>Candidates</em> (especially experienced) skip roles with vague or unrealistic requirements.</p><p>So let&#8217;s fix that. Below is a clear, practical breakdown of what analytics engineers actually do and what skills they need to succeed.</p><div><hr></div><h3><strong>#1: Building and Maintaining Data Pipelines and Transformations</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!MeeL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90cc517e-0f60-4d50-90e7-515e071fd2cf_1893x624.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!MeeL!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90cc517e-0f60-4d50-90e7-515e071fd2cf_1893x624.png 424w, /__u/substackcdn.com/image/fetch/$s_!MeeL!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90cc517e-0f60-4d50-90e7-515e071fd2cf_1893x624.png 848w, /__u/substackcdn.com/image/fetch/$s_!MeeL!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90cc517e-0f60-4d50-90e7-515e071fd2cf_1893x624.png 1272w, /__u/substackcdn.com/image/fetch/$s_!MeeL!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90cc517e-0f60-4d50-90e7-515e071fd2cf_1893x624.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!MeeL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90cc517e-0f60-4d50-90e7-515e071fd2cf_1893x624.png" width="1456" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90cc517e-0f60-4d50-90e7-515e071fd2cf_1893x624.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34267,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/180374199?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90cc517e-0f60-4d50-90e7-515e071fd2cf_1893x624.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!MeeL!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90cc517e-0f60-4d50-90e7-515e071fd2cf_1893x624.png 424w, /__u/substackcdn.com/image/fetch/$s_!MeeL!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90cc517e-0f60-4d50-90e7-515e071fd2cf_1893x624.png 848w, /__u/substackcdn.com/image/fetch/$s_!MeeL!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90cc517e-0f60-4d50-90e7-515e071fd2cf_1893x624.png 1272w, /__u/substackcdn.com/image/fetch/$s_!MeeL!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90cc517e-0f60-4d50-90e7-515e071fd2cf_1893x624.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is the area where analytics engineering overlaps with traditional data engineering. But the focus is different.</p><p><em>Data engineers</em> work deeper in the infrastructure: ingestion systems, pipelines, scalability, and platform reliability.</p><p><em>Analytics engineers</em> take the raw data produced by those pipelines and turn it into structured, analytics-ready datasets.</p><p>To do that well, they rely on a set of core technical skills.</p><p><strong>&#9989; Core Skills</strong></p><ul><li><p>Strong SQL proficiency</p></li><li><p>Mastery of dbt or similar transformation frameworks</p></li><li><p>Git fundamentals (branches, pull requests, conflict resolution)</p></li><li><p><em>(Nice to have)</em> Python skills (basic understanding would suffice)</p></li><li><p><em>(Nice to have)</em> Familiarity with Airflow, Dagster, or dbt Cloud</p></li></ul><p><strong>&#128073; Key Responsibilities</strong></p><ul><li><p>Build and maintain reliable transformation pipelines</p></li><li><p>Write clean, reusable SQL code</p></li><li><p>Ensure pipelines run on schedule and scale with data volume</p></li><li><p>Review code from teammates and enforce best practices</p></li></ul><div><hr></div><h3><strong>#2: Designing and Modeling Data for Analytics</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!wL-v!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59bcacdc-f706-42ec-a655-e610937c630b_1893x624.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!wL-v!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59bcacdc-f706-42ec-a655-e610937c630b_1893x624.png 424w, /__u/substackcdn.com/image/fetch/$s_!wL-v!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59bcacdc-f706-42ec-a655-e610937c630b_1893x624.png 848w, /__u/substackcdn.com/image/fetch/$s_!wL-v!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59bcacdc-f706-42ec-a655-e610937c630b_1893x624.png 1272w, /__u/substackcdn.com/image/fetch/$s_!wL-v!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59bcacdc-f706-42ec-a655-e610937c630b_1893x624.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!wL-v!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59bcacdc-f706-42ec-a655-e610937c630b_1893x624.png" width="1456" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/59bcacdc-f706-42ec-a655-e610937c630b_1893x624.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:37093,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/180374199?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59bcacdc-f706-42ec-a655-e610937c630b_1893x624.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!wL-v!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59bcacdc-f706-42ec-a655-e610937c630b_1893x624.png 424w, /__u/substackcdn.com/image/fetch/$s_!wL-v!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59bcacdc-f706-42ec-a655-e610937c630b_1893x624.png 848w, /__u/substackcdn.com/image/fetch/$s_!wL-v!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59bcacdc-f706-42ec-a655-e610937c630b_1893x624.png 1272w, /__u/substackcdn.com/image/fetch/$s_!wL-v!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F59bcacdc-f706-42ec-a655-e610937c630b_1893x624.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is where analytics engineers start to differentiate from other roles.</p><p>Analytics engineers <em>design datasets</em> that power dashboards, decision-making, and self-serve analysis. If the data model is messy, unclear, or inconsistent, everything downstream becomes harder.</p><p>On a similar note, not only those datasets should be helpful and easy to use, but also they need to be performant and cost efficient. Business stakeholders won&#8217;t wait for the dashboard for 10 minutes and spend fortune on that.</p><p><strong>&#9989; Core Skills</strong></p><ul><li><p>Understanding dimensional modeling</p></li><li><p>Knowing when to normalize or denormalize</p></li><li><p>Familiarity with Slowly Changing Dimensions</p></li><li><p>Modeling for BI tools and semantic layers</p></li><li><p>Optimizing complex SQL queries</p></li><li><p>Implementing incremental and scalable models</p></li></ul><p><strong>&#128073; Key Responsibilities</strong></p><ul><li><p>Design clean, scalable, analytics-ready datasets</p></li><li><p>Create unified metric definitions and ensure consistency</p></li><li><p>Anticipate downstream BI needs and user behavior</p></li><li><p>Balance performance, maintainability, and cost</p></li></ul><div><hr></div><h3><strong>#3: Ensuring Data Quality and Observability</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!V5EJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b4900f4-c7cd-456d-b550-60d9035407fb_1893x624.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!V5EJ!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b4900f4-c7cd-456d-b550-60d9035407fb_1893x624.png 424w, /__u/substackcdn.com/image/fetch/$s_!V5EJ!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b4900f4-c7cd-456d-b550-60d9035407fb_1893x624.png 848w, /__u/substackcdn.com/image/fetch/$s_!V5EJ!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b4900f4-c7cd-456d-b550-60d9035407fb_1893x624.png 1272w, /__u/substackcdn.com/image/fetch/$s_!V5EJ!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b4900f4-c7cd-456d-b550-60d9035407fb_1893x624.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!V5EJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b4900f4-c7cd-456d-b550-60d9035407fb_1893x624.png" width="1456" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b4900f4-c7cd-456d-b550-60d9035407fb_1893x624.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:32705,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/180374199?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b4900f4-c7cd-456d-b550-60d9035407fb_1893x624.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!V5EJ!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b4900f4-c7cd-456d-b550-60d9035407fb_1893x624.png 424w, /__u/substackcdn.com/image/fetch/$s_!V5EJ!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b4900f4-c7cd-456d-b550-60d9035407fb_1893x624.png 848w, /__u/substackcdn.com/image/fetch/$s_!V5EJ!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b4900f4-c7cd-456d-b550-60d9035407fb_1893x624.png 1272w, /__u/substackcdn.com/image/fetch/$s_!V5EJ!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b4900f4-c7cd-456d-b550-60d9035407fb_1893x624.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Even the best data models are useless if they&#8217;re not trustworthy.</p><p>To build confidence, analytics engineers put strong <em>data quality</em> and <em>observability</em> practices in place.</p><p>This ensures that the datasets the business relies on are accurate, fresh, and dependable.</p><p><strong>&#9989; Core Skills</strong></p><ul><li><p>Writing automated data tests</p></li><li><p>Monitoring data freshness and detecting anomalies</p></li><li><p>Implementing pipeline monitoring and alerting</p></li><li><p>Understanding lineage and dependencies</p></li><li><p>Documenting logic, assumptions, and model behavior</p></li></ul><p><strong>&#128073;  Key Responsibilities</strong></p><ul><li><p>Ensure data accuracy, completeness, and freshness</p></li><li><p>Implement tests to catch failures early</p></li><li><p>Monitor pipelines and resolve incidents</p></li><li><p>Investigate unusual spikes, drops, or inconsistencies</p></li><li><p>Maintain documentation to support transparency and trust</p></li></ul><div><hr></div><h3><strong>#4: Collaborating with Business Stakeholders</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!lhOM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c067ec-1f97-4fb2-b210-cceee92d3350_1893x624.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!lhOM!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c067ec-1f97-4fb2-b210-cceee92d3350_1893x624.png 424w, /__u/substackcdn.com/image/fetch/$s_!lhOM!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c067ec-1f97-4fb2-b210-cceee92d3350_1893x624.png 848w, /__u/substackcdn.com/image/fetch/$s_!lhOM!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c067ec-1f97-4fb2-b210-cceee92d3350_1893x624.png 1272w, /__u/substackcdn.com/image/fetch/$s_!lhOM!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c067ec-1f97-4fb2-b210-cceee92d3350_1893x624.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!lhOM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c067ec-1f97-4fb2-b210-cceee92d3350_1893x624.png" width="1456" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/96c067ec-1f97-4fb2-b210-cceee92d3350_1893x624.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34660,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/180374199?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c067ec-1f97-4fb2-b210-cceee92d3350_1893x624.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!lhOM!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c067ec-1f97-4fb2-b210-cceee92d3350_1893x624.png 424w, /__u/substackcdn.com/image/fetch/$s_!lhOM!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c067ec-1f97-4fb2-b210-cceee92d3350_1893x624.png 848w, /__u/substackcdn.com/image/fetch/$s_!lhOM!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c067ec-1f97-4fb2-b210-cceee92d3350_1893x624.png 1272w, /__u/substackcdn.com/image/fetch/$s_!lhOM!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F96c067ec-1f97-4fb2-b210-cceee92d3350_1893x624.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is where analytics engineering truly comes to life.</p><p>You can write beautiful SQL and build elegant models, but if they don&#8217;t solve real business problems &#8212; they don&#8217;t create value.</p><p>That&#8217;s why great analytics engineers are <em>strong communicators</em> who understand the &#8220;why&#8221; behind the data and build for that purpose.</p><p><strong>&#9989; Core Skills</strong></p><ul><li><p>Explaining complex data concepts in simple language</p></li><li><p>Translating business logic into metrics and models</p></li><li><p>Understanding domains like product, marketing, or finance</p></li><li><p>Gathering requirements and asking smart clarifying questions</p></li><li><p>Setting expectations, negotiating trade-offs, and prioritizing work</p></li></ul><p><strong>&#128073;  Key Responsibilities</strong></p><ul><li><p>Identify key decisions and define how data supports them</p></li><li><p>Translate vague business questions into clear data solutions</p></li><li><p>Run requirement-gathering sessions with stakeholders</p></li><li><p>Communicate changes, limitations, and trade-offs</p></li><li><p>Bridge technical data teams with non-technical business teams</p></li></ul><h2>&#128683; Out of Scope</h2><p>Now that we&#8217;ve defined the <em>core</em> responsibilities of analytics engineers, it&#8217;s equally important to clarify what <strong>isn&#8217;t</strong> part of the role.</p><p>This matters because analytics engineering naturally overlaps with both data engineering and data analysis. Some companies misunderstand this overlap and end up assigning work that belongs to a different discipline entirely. Others simply create unrealistic job descriptions because they&#8217;re not sure where the boundaries should be.</p><p>Let&#8217;s set those boundaries clearly.</p><p>Below is a list &#8212; in no particular order &#8212; of skills and responsibilities that are <strong>outside the scope &#10060; </strong> of analytics engineering and should not be expected from this role :</p><ul><li><p><strong>Ad-hoc analysis for business teams</strong> &#8594; <em>Data Analysts</em></p></li><li><p><strong>Algorithms and data structures</strong> &#8594; <em>Data Engineers / Software Engineers</em></p></li><li><p><strong>Advanced statistics and probability</strong> &#8594; <em>Data Scientists</em></p></li><li><p><strong>Building machine learning models</strong> &#8594; <em>Data Scientists</em></p></li><li><p><strong>Setting up Kafka or ingestion infrastructure</strong> &#8594; <em>Data Engineers</em></p></li><li><p><strong>Managing Spark clusters</strong> &#8594; <em>Data Engineers</em></p></li><li><p><strong>Owning data lake architectures</strong> &#8594; <em>Data Engineers / Data Architects</em></p></li><li><p><strong>Writing backend microservices</strong> &#8594; <em>Software Engineers / Data Engineers</em></p></li><li><p><strong>Developing custom Python ETL frameworks</strong> &#8594; <em>Data Engineers</em></p></li><li><p><strong>Managing DevOps (Terraform, Kubernetes)</strong> &#8594; <em>DataOps / Platform Engineers</em></p></li></ul><p>These tasks might seem related because they all touch the broader data ecosystem &#8212; but they do <strong>not</strong> fall under analytics engineering. Mixing these responsibilities into an AE role leads to confusion, misalignment, and frustration on both sides.</p><h2>&#127937; Final Words</h2><p>Analytics engineering is a modern, dynamic, and genuinely exciting role. It blends technical skill with business understanding, and when done well, it can help a company scale its analytics capabilities to an entirely new level &#128640;.</p><p>But that doesn&#8217;t mean analytics engineers should carry the entire data function on their shoulders. Clear boundaries and realistic expectations are what allow this role to deliver its full impact.</p><p>I hope this article becomes a useful guide for both companies and candidates &#8212; helping everyone stay aligned on what analytics engineering <em>is</em> and what it <em>isn&#8217;t</em>.</p><p>And if you think I missed something or pushed too hard on the definition of the role&#8230; let me know. Let&#8217;s shape the boundaries together &#128516;</p><p>P.S. Subscribe here and <a href="https://www.linkedin.com/in/oleg-agapov/">on LinkedIn</a> to  learn more about analytics engineering!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Og4U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 424w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 848w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Og4U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png" width="415" height="415" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:415,&quot;bytes&quot;:2752273,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/168442302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 424w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 848w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dbtips.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[The Core Principles of Robust Data Modeling (Part 2)]]></title><description><![CDATA[Let&#8217;s talks about performance and data quality of analytical models]]></description><link>https://dbtips.substack.com/p/the-core-principles-of-robust-data-480</link><guid isPermaLink="false">https://dbtips.substack.com/p/the-core-principles-of-robust-data-480</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Tue, 05 Aug 2025 16:04:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!S9zc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cf33ac-e3d0-4e34-a6d8-4fe6974d76da_3840x2160.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!S9zc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cf33ac-e3d0-4e34-a6d8-4fe6974d76da_3840x2160.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!S9zc!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cf33ac-e3d0-4e34-a6d8-4fe6974d76da_3840x2160.png 424w, /__u/substackcdn.com/image/fetch/$s_!S9zc!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cf33ac-e3d0-4e34-a6d8-4fe6974d76da_3840x2160.png 848w, /__u/substackcdn.com/image/fetch/$s_!S9zc!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cf33ac-e3d0-4e34-a6d8-4fe6974d76da_3840x2160.png 1272w, /__u/substackcdn.com/image/fetch/$s_!S9zc!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cf33ac-e3d0-4e34-a6d8-4fe6974d76da_3840x2160.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!S9zc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cf33ac-e3d0-4e34-a6d8-4fe6974d76da_3840x2160.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e9cf33ac-e3d0-4e34-a6d8-4fe6974d76da_3840x2160.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:116215,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/170146077?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cf33ac-e3d0-4e34-a6d8-4fe6974d76da_3840x2160.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!S9zc!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cf33ac-e3d0-4e34-a6d8-4fe6974d76da_3840x2160.png 424w, /__u/substackcdn.com/image/fetch/$s_!S9zc!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cf33ac-e3d0-4e34-a6d8-4fe6974d76da_3840x2160.png 848w, /__u/substackcdn.com/image/fetch/$s_!S9zc!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cf33ac-e3d0-4e34-a6d8-4fe6974d76da_3840x2160.png 1272w, /__u/substackcdn.com/image/fetch/$s_!S9zc!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe9cf33ac-e3d0-4e34-a6d8-4fe6974d76da_3840x2160.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In the <a href="/__u/dbtips.substack.com/p/the-core-principles-of-robust-data">previous post</a>, I discussed the first two important principles of robust data modeling:</p><ul><li><p>&#128200; scalability, and</p></li><li><p>&#9851;&#65039; reusability.</p></li></ul><p>In this post, I'll explore the other two critical principles: </p><ul><li><p>&#9889;&#65039; performance, and</p></li><li><p> &#9989; data quality.</p></li></ul><p>Let's dive in!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>&#9889;&#65039; Performance</h2><p>In analytical data modeling, performance can be measured by:</p><ul><li><p>how quickly the model can be <em>built</em></p></li><li><p>how rapidly business users can <em>retrieve results</em> from the data model</p></li><li><p>the <em>costs</em> associated with building and querying the model</p></li></ul><p>In cloud data warehouses speed and cost are deeply interconnected. Faster model building leads to lower costs, while longer query processing times result in higher expenses.</p><p>Simply put: optimize speed and you'll optimize costs&#128178;.</p><p>But performance matters not only because it saves money. Business stakeholders need dashboards that load quickly, no one will wait hours for the dashboard to finish. So the key to optimizing performance is finding the right balance between speed and costs.</p><p>Let's explore some approaches to achieve this balance.</p><h3>&#128736;&#65039; Choose suitable materialization</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!R_up!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd8a89d-b806-4425-aeb4-e586138af34d_3840x1254.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!R_up!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd8a89d-b806-4425-aeb4-e586138af34d_3840x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!R_up!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd8a89d-b806-4425-aeb4-e586138af34d_3840x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!R_up!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd8a89d-b806-4425-aeb4-e586138af34d_3840x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!R_up!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd8a89d-b806-4425-aeb4-e586138af34d_3840x1254.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!R_up!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd8a89d-b806-4425-aeb4-e586138af34d_3840x1254.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9fd8a89d-b806-4425-aeb4-e586138af34d_3840x1254.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:73861,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/170146077?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd8a89d-b806-4425-aeb4-e586138af34d_3840x1254.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!R_up!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd8a89d-b806-4425-aeb4-e586138af34d_3840x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!R_up!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd8a89d-b806-4425-aeb4-e586138af34d_3840x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!R_up!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd8a89d-b806-4425-aeb4-e586138af34d_3840x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!R_up!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fd8a89d-b806-4425-aeb4-e586138af34d_3840x1254.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The easiest way to optimize performance is to choose the correct data materialization.</p><p>Usually data models are materialized as database <strong>views</strong> or <strong>tables</strong>. Tables, in turn, can be materialized <strong>from scratch</strong> each run (full refresh) or aggregated <strong>incrementally</strong>.</p><p><strong>Database views</strong> are useful when data models consist of <em>light transformations</em> and don't require joins or aggregations. Examples of light transformations are:</p><ul><li><p>CASE WHEN statements</p></li><li><p>formulas on columns</p></li><li><p>data type casting</p></li><li><p>columns renaming</p></li></ul><p>Most database engines can apply such transformations on the fly, so using table materialization could be a waste of time and compute. For example, <a href="https://docs.getdbt.com/best-practices/how-we-structure/2-staging#staging-models">dbt recommends</a> making models in the staging layer as views because they don't contain joins or aggregations (GROUP BY).</p><p>Data models should be materialized as <strong>tables</strong> in two cases:</p><ol><li><p>The model is a <em>user-facing table</em> that requires the best performance.</p></li><li><p>The model is <em>heavy to calculate</em> and is being used in multiple downstream models. All models in Marts or Gold layer should be materialized as tables to give the quickest response time for end-users.</p></li></ol><p>Some <em>intermediate</em> models might contain complex business logic that requires multiple joins and are slow to query, so it's better to materialize such models as tables as well. This is especially beneficial if multiple downstream models use them in their calculations.</p><p>My general rule of thumb &#128077; is materializing data marts as tables, the rest as views. And if views are too slow, switch them to tables as well.</p><p>As I mentioned earlier, tables can be created in two ways: by <strong>re-creating from scratch</strong> each run or by <strong>loading incrementally</strong>, processing only the new data.</p><p>Both approaches have their pros and cons.</p><p>Re-creating a table from scratch each run (i.e., full refresh) is definitely easier because you don't have to deal with schema migration or any additional DDL commands. But this method might be expensive, especially for big data sources.</p><p>Loading tables incrementally, on the other hand, allows you to process only the new data and save on processing time and money. On the flip side, you'll have to deal with occasional <em>schema migrations</em> (add/remove columns) and backfills. Here, my general tip is to start with the full-refresh approach and switch to incremental if the data size is big enough that you actually start having benefits from the more complex setup.</p><p><strong>Action points</strong>:</p><p>&#10067; Check your data models to see if you can improve performance by applying the correct materialization strategy</p><p>&#10060; If all your data models are materialized as either only tables or only views, your model performance is likely suboptimal</p><p>&#9989; Ensure that models with light transformations are views, user-facing models are tables, and large tables are built incrementally. dbt Labs recommends this approach in their famous &#8220;<a href="https://docs.getdbt.com/best-practices/how-we-structure/1-guide-overview">How we structure our dbt projects</a>&#8221; guide</p><h3>&#128373;&#65039;&#8205;&#9794;&#65039; Add Data Observability</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!VxIf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb277400e-5743-4da6-9cc4-a5b8627a2df3_3840x1254.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!VxIf!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb277400e-5743-4da6-9cc4-a5b8627a2df3_3840x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!VxIf!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb277400e-5743-4da6-9cc4-a5b8627a2df3_3840x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!VxIf!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb277400e-5743-4da6-9cc4-a5b8627a2df3_3840x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!VxIf!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb277400e-5743-4da6-9cc4-a5b8627a2df3_3840x1254.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!VxIf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb277400e-5743-4da6-9cc4-a5b8627a2df3_3840x1254.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b277400e-5743-4da6-9cc4-a5b8627a2df3_3840x1254.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:69269,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/170146077?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb277400e-5743-4da6-9cc4-a5b8627a2df3_3840x1254.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!VxIf!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb277400e-5743-4da6-9cc4-a5b8627a2df3_3840x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!VxIf!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb277400e-5743-4da6-9cc4-a5b8627a2df3_3840x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!VxIf!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb277400e-5743-4da6-9cc4-a5b8627a2df3_3840x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!VxIf!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb277400e-5743-4da6-9cc4-a5b8627a2df3_3840x1254.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The second important aspect is implementing robust data observability.</p><p>Data observability is the practice of <strong>monitoring and understanding your data pipelines</strong>. It helps with:</p><ul><li><p>tracking model performance, for example run times</p></li><li><p>data lineage, to identify dependencies between models</p></li><li><p>monitoring data quality</p></li></ul><p>When a model moves to production, its runtime can silently increase due to data growth or project complexity. Having reports that show build times for each data model helps prevent unexpected cost increase.</p><p>Another problem data observability can help with is so-called "modelnecks" &#8212; bottlenecks where one long-running model slows down the entire pipeline because dependent models must wait for it to finish. By analyzing model build times alongside data lineage helps you spot and proactively resolve these modelnecks.</p><p>You can improve a slow-running model by selecting the right materialization strategy, implementing incremental loading, or refactoring it into smaller models to increase the throughput.</p><p>The final component of effective data observability is the ability to logically break down the DAG into smaller, more manageable parts. Many data lineage tools allow you to <em>add metadata</em> to models, such as tags, helping you identify critical pipeline components to prioritize during optimization. For example, dbt supports <a href="https://docs.getdbt.com/reference/resource-configs/tags">adding tags</a> to models and selecting models based on these tags when visualizing or building models. This feature makes pipeline management significantly more efficient.</p><p><strong>Action points</strong>:</p><p>&#10067; Check which metrics you track regarding model performance: run times, number of failures, and time in queue</p><p>&#10060; Inability to see these metrics over time may lead to silent cost increases and performance degradation</p><p>&#9989; Choose from different options to implement data observability. For dbt projects, you can start with dbt Cloud (paid) or install open-source tools like <a href="https://github.com/elementary-data/elementary">Elementary</a></p><h3>&#127950;&#65039; Utilize database optimizations</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!l1LE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef8368c-b0e2-4be9-8324-aa413ec0468a_3840x1254.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!l1LE!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef8368c-b0e2-4be9-8324-aa413ec0468a_3840x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!l1LE!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef8368c-b0e2-4be9-8324-aa413ec0468a_3840x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!l1LE!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef8368c-b0e2-4be9-8324-aa413ec0468a_3840x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!l1LE!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef8368c-b0e2-4be9-8324-aa413ec0468a_3840x1254.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!l1LE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef8368c-b0e2-4be9-8324-aa413ec0468a_3840x1254.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bef8368c-b0e2-4be9-8324-aa413ec0468a_3840x1254.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:90424,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/170146077?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef8368c-b0e2-4be9-8324-aa413ec0468a_3840x1254.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!l1LE!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef8368c-b0e2-4be9-8324-aa413ec0468a_3840x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!l1LE!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef8368c-b0e2-4be9-8324-aa413ec0468a_3840x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!l1LE!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef8368c-b0e2-4be9-8324-aa413ec0468a_3840x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!l1LE!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbef8368c-b0e2-4be9-8324-aa413ec0468a_3840x1254.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Last but not least is utilizing all possible <strong>technical optimizations</strong> available in your database. This tip alone could fill an entire book, so I'll provide some general guidance instead.</p><p>First, understand that <strong>different database types</strong> require different optimization techniques. Postgres, BigQuery, and Apache Spark have fundamentally different architectures, so you need to learn the specific advantages and limitations of your particular database or processing engine.</p><p>At the same time, some tips are applicable <strong>across a range of technologies</strong>. For example, all <em>columnar data warehouses</em> (BigQuery, Snowflake, Redshift) share common optimization techniques, such as:</p><ul><li><p>utilizing partitioning and clustering</p></li><li><p>applying data pruning as early as possible</p></li><li><p>avoiding ORDER BY when unnecessary</p></li><li><p>preferring window functions over self-joins</p></li><li><p>and so on</p></li></ul><p>Therefore, the best approach is to begin by researching optimization techniques specific to your technology stack.</p><p>If you use Snowflake data platform, I recommend checking out the <a href="https://select.dev/posts">SELECT blog</a>. This company specializes in optimizing Snowflake costs. They share valuable advice on how to tune data warehouse performance using not only the techniques mentioned above, but also vendor-specific settings like thread count or warehouse size.</p><p>Finally, an important tip is to learn how to read <strong>execution plans</strong> using the EXPLAIN keyword. This SQL command shows how your query will be executed in the database, revealing the actual operations performed.</p><p>Execution plans are very valuable for finding <em>bottlenecks</em> in SQL queries. I particularly look for:</p><ul><li><p>full table scans instead of filtered views (t<em>ypically caused by missing or misplaced WHERE clauses</em>)</p></li><li><p>cardinality explosions (<em>usually resulting from incorrect or poorly placed JOINs</em>)</p></li></ul><p>Some databases, like Snowflake, provide a user-friendly visualization of execution plans, making it easier to debug and identify performance bottlenecks.</p><p><strong>Action points</strong>:</p><p>&#10067; Learn more about the underlying technology of your data stack</p><p>&#10060; Using only generic or random optimization tips cannot guarantee optimal performance for your specific technology</p><p>&#9989; Look for specialists or companies that focus on data stack optimizations. Excellent examples are <a href="https://select.dev/posts/snowflake-query-optimization">this blog post</a> about Snowflake or <a href="https://www.analytics8.com/blog/guide-to-optimize-databricks-for-cost-and-performance/">this post</a> about Databricks optimization</p><h2>&#9989; Data quality</h2><p>The last crucial principle of building robust data models is maintaining the highest standards of data quality.</p><p>Data quality measures how well data meets consumer expectations. For example, consumers of your data models expect the data to be <em>accurate</em>, <em>consistent</em>, <em>reliable</em>, and much more. Higher quality data builds more trust and leads to greater use in business decisions.</p><p>Let's explore how to achieve a great data quality of your models.</p><h3>&#128257; Apply end-to-end data testing</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!1J7f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed0e02d-4dcf-496f-b734-7f5f36c671bb_3840x1254.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!1J7f!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed0e02d-4dcf-496f-b734-7f5f36c671bb_3840x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!1J7f!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed0e02d-4dcf-496f-b734-7f5f36c671bb_3840x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!1J7f!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed0e02d-4dcf-496f-b734-7f5f36c671bb_3840x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!1J7f!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed0e02d-4dcf-496f-b734-7f5f36c671bb_3840x1254.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!1J7f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed0e02d-4dcf-496f-b734-7f5f36c671bb_3840x1254.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bed0e02d-4dcf-496f-b734-7f5f36c671bb_3840x1254.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:81915,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/170146077?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed0e02d-4dcf-496f-b734-7f5f36c671bb_3840x1254.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!1J7f!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed0e02d-4dcf-496f-b734-7f5f36c671bb_3840x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!1J7f!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed0e02d-4dcf-496f-b734-7f5f36c671bb_3840x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!1J7f!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed0e02d-4dcf-496f-b734-7f5f36c671bb_3840x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!1J7f!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbed0e02d-4dcf-496f-b734-7f5f36c671bb_3840x1254.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A naive approach to data quality is to measure the characteristics mentioned above (like accuracy and consistency) only for business-facing data models. This means applying periodic testing just to tables that end users interact with. However, data quality measures can be <strong>applied to a much wider range of use cases</strong> throughout the data pipeline.</p><p>If we carefully examine how data flows into the data warehouse and is subsequently transformed into data models, we can distinguish several stages where data quality can be checked:</p><ol><li><p>&#127793; <em>External data</em> used to build analytical models should be monitored for unexpected values, incompleteness, and timeliness (freshness)</p></li><li><p>&#128119; <em>During development</em> of new models or modification of existing ones, data tests can be run on the final models to signal if the new or modified code breaks any assumptions about the data</p></li><li><p>&#128674; <em>Before deploying</em> new changes to production, automated tests can assure us that they won't break any existing reports</p></li><li><p>&#9201;&#65039; Finally, <em>periodic tests on production</em> tables can tell us if newly added data still meets our quality standards</p></li></ol><p>This approach resembles the "Shift Left" approach I explained in the previous article. The earlier you catch a problem, the sooner you can fix it and avoid building production data models with errors.</p><p><strong>Different types of tests should be applied to different stages</strong>.</p><p>For example, <em>dbt freshness</em> tests can be applied to source tables to ensure they don't have stale data. Also, <em>data contracts</em> can be applied to make sure that our assumptions about the incoming data still hold. <a href="https://www.montecarlodata.com/blog-data-contracts-explained/">Data contracts</a> can check that the number of columns hasn't changed, or that data types remain the same as before.</p><p>During development, <em>data tests</em> and <em>unit tests</em> can greatly help in delivering high quality datasets. <em>Data tests</em> are used to check the assumptions about the data, for example that a column is not empty, or it contains only expected values. <em>Unit tests</em> are useful to check model transformation logic &#8212; by using mock inputs and expected outputs they can signal when changes break the logic of data models.</p><p><em>Periodic tests in Production</em> typically include data tests and freshness tests. Fresh data sources provide confirmation that new data has arrived and models can be rebuilt. Data tests ensure that the new data remains correct and contains expected values.</p><p><strong>Action points</strong>:</p><p>&#10067; Inspect different stages of the data flow and examine what kinds of tests are currently applied</p><p>&#10060; If you don't have any tests, implement them throughout your entire data pipeline, from ingestion to final data marts</p><p>&#9989; If you're using dbt, you can immediately start using data tests, unit tests, and freshness tests. For other stacks, try <a href="https://github.com/sodadata/soda-core">Soda tests</a> or <a href="https://greatexpectations.io/gx-core/">Great Expectations</a></p><h3>&#9775;&#65039; Balance coverage and redundancy</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!o9fX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5745437-7051-4d3e-8bcb-17641dd6b19b_3840x1254.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!o9fX!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5745437-7051-4d3e-8bcb-17641dd6b19b_3840x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!o9fX!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5745437-7051-4d3e-8bcb-17641dd6b19b_3840x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!o9fX!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5745437-7051-4d3e-8bcb-17641dd6b19b_3840x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!o9fX!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5745437-7051-4d3e-8bcb-17641dd6b19b_3840x1254.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!o9fX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5745437-7051-4d3e-8bcb-17641dd6b19b_3840x1254.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d5745437-7051-4d3e-8bcb-17641dd6b19b_3840x1254.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79819,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/170146077?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5745437-7051-4d3e-8bcb-17641dd6b19b_3840x1254.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!o9fX!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5745437-7051-4d3e-8bcb-17641dd6b19b_3840x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!o9fX!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5745437-7051-4d3e-8bcb-17641dd6b19b_3840x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!o9fX!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5745437-7051-4d3e-8bcb-17641dd6b19b_3840x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!o9fX!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5745437-7051-4d3e-8bcb-17641dd6b19b_3840x1254.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>While it may seem logical to test every possible model in your data pipeline, this approach is often counterproductive.</p><p>First, covering all data models with tests can significantly increase testing time and incur additional costs.</p><p>Second, many data tests will duplicate each other because some columns are simply carried from model to model without changes.</p><p>&#9878;&#65039; You need to balance tests <strong>coverage with redundancy</strong> &#8212; on one hand you want good coverage, but not at the expense of longer waiting times and higher costs.</p><p>To streamline this process, you should implement <strong>testing conventions</strong>. These conventions should clearly define what to test, when to test it, and how frequently tests should be run.</p><p>Here are the <em>testing conventions</em> I use in my work:</p><ul><li><p>Always add a primary key test to your models. If the model doesn't have a primary key, generate a surrogate key and test it.</p></li><li><p>Test columns as early in the pipeline as possible (applying the Shift Left principle). In dbt projects, this is typically in the staging layer.</p></li><li><p>Define tests based on column category:</p><ul><li><p>Primary keys should have not_null and uniqueness tests</p></li><li><p>Categorical columns should have accepted values tests</p></li><li><p>Booleans should be checked for accepted values (ensuring they contain BOOLEAN type, not STRING like "true")</p></li><li><p>Numbers should be checked according to business logic (e.g., order_value should always be positive)</p></li><li><p>And so on</p></li></ul></li><li><p>In downstream models, only test columns that were modified or newly introduced. Testing columns carried over unchanged is redundant.</p></li><li><p>Redundancy is acceptable in the final layer with business-related models. You can add primary key tests and additional checks to all important columns, like testing for missing values, expected values, and business logic (for example, shipping date should always be later than the order date).</p></li></ul><p><strong>Action points</strong>:</p><p>&#10067; Check if your team has any conventions regarding data testing</p><p>&#10060; If you don't have any, it can mean that your strategy is not optimal, you are missing some tests cases or vice versa apply too many tests</p><p>&#9989; Start with the list of conventions I provided above and then extend and adapt to your needs. Try <a href="https://dbt-labs.github.io/dbt-project-evaluator/latest/rules/testing/#test-coverage">dbt-project-evaluator package</a> that can measure tests coverage and some other useful metrics about the projects</p><h3>&#129504; Build with testing in mind</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!95ny!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac207943-c7d3-4fe4-b4ab-45cc80dc0214_3840x1254.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!95ny!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac207943-c7d3-4fe4-b4ab-45cc80dc0214_3840x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!95ny!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac207943-c7d3-4fe4-b4ab-45cc80dc0214_3840x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!95ny!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac207943-c7d3-4fe4-b4ab-45cc80dc0214_3840x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!95ny!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac207943-c7d3-4fe4-b4ab-45cc80dc0214_3840x1254.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!95ny!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac207943-c7d3-4fe4-b4ab-45cc80dc0214_3840x1254.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ac207943-c7d3-4fe4-b4ab-45cc80dc0214_3840x1254.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:73631,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/170146077?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac207943-c7d3-4fe4-b4ab-45cc80dc0214_3840x1254.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!95ny!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac207943-c7d3-4fe4-b4ab-45cc80dc0214_3840x1254.png 424w, /__u/substackcdn.com/image/fetch/$s_!95ny!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac207943-c7d3-4fe4-b4ab-45cc80dc0214_3840x1254.png 848w, /__u/substackcdn.com/image/fetch/$s_!95ny!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac207943-c7d3-4fe4-b4ab-45cc80dc0214_3840x1254.png 1272w, /__u/substackcdn.com/image/fetch/$s_!95ny!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fac207943-c7d3-4fe4-b4ab-45cc80dc0214_3840x1254.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In software engineering, a popular approach to developing software is called test-driven development (TDD) involves writing tests before writing the code. Once tests are established, developers must create software that meets all quality standards to pass these tests.</p><p>This approach <em>isn't always suitable for data models</em>. We often design a model, begin implementation, adjust the initial design based on new information, and iterate again. In this context, writing tests first can be challenging.</p><p>That's why I suggest a more flexible alternative which I call <strong>test-informed development</strong>.</p><p>It's based on several principles:</p><ol><li><p>When building models, <em>consider which tests can be applied</em> to them</p></li><li><p>Add necessary tests <em>shortly after completing development</em>, including those that might be valuable in the future</p></li><li><p>Follow a <em>build-test-adjust-retest</em> cycle to ensure your assumptions about the data remain valid after changing the code of the model</p></li></ol><p>I'm advocating for intentional testing, where models are designed with testability in mind. This approach doesn't strictly follow TDD, but it prioritizes quality and correctness during development.</p><p>Classic TDD is <em>technically possible</em> when utilizing unit testing. For example, dbt 1.8 <a href="https://docs.getdbt.com/blog/announcing-unit-testing">introduced unit tests</a> as first-class citizens, allowing analytics engineers to test SQL logic without using any underlying data.</p><p>However, technical possibility doesn't guarantee universal adoption. Rather than requiring that everyone should write unit tests, it's better to embrace a more flexible approach where model developers naturally incorporate testing considerations into their process.</p><p>After building up a solid collection of tests in your project, you'll gain greater confidence when modifying logic, as comprehensive test coverage can identify bugs and potential issues before code reaches production. If you later decide to implement unit testing, refactoring large models becomes significantly easier because you can test not only the model's output but also its underlying logic directly.</p><p><strong>Action points</strong>:</p><p>&#10067; Evaluate how your team develops and merges data models to Production</p><p>&#10060; Lack of testing guidelines and deploying to Production without proper tests indicates poor engineering practices that can lead to serious failures</p><p>&#9989; Educate your team about data testing importance, add "I have run data tests" to your PR checklist, and incorporate tests into your CI pipeline</p><h2>Summary</h2><p>This is the final post of &#8220;<strong>The Core Principles of Robust Data Modeling</strong>&#8221; a mini-series where I covered the last two pronciples. Check the <a href="/__u/dbtips.substack.com/p/the-core-principles-of-robust-data">first post here</a>.</p><p>If you liked it, give it a heart and share with a colleagues.</p><p>Subscribe here or <a href="https://www.linkedin.com/in/oleg-agapov/">on LinkedIn</a> to learn more about <strong>data modeling</strong> and <strong>analytics engineering</strong>!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Og4U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 424w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 848w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Og4U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png" width="415" height="415" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:415,&quot;bytes&quot;:2752273,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/168442302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 424w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 848w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dbtips.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[The Core Principles of Robust Data Modeling (Part 1)]]></title><description><![CDATA[How to build scalable and reusable analytical models]]></description><link>https://dbtips.substack.com/p/the-core-principles-of-robust-data</link><guid isPermaLink="false">https://dbtips.substack.com/p/the-core-principles-of-robust-data</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Wed, 16 Jul 2025 07:07:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HxFu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b3874e-819e-41b0-b500-45f66ba27fd7_1920x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!HxFu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b3874e-819e-41b0-b500-45f66ba27fd7_1920x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!HxFu!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b3874e-819e-41b0-b500-45f66ba27fd7_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!HxFu!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b3874e-819e-41b0-b500-45f66ba27fd7_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!HxFu!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b3874e-819e-41b0-b500-45f66ba27fd7_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!HxFu!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b3874e-819e-41b0-b500-45f66ba27fd7_1920x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!HxFu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b3874e-819e-41b0-b500-45f66ba27fd7_1920x1080.png" width="728" height="409.5" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/31b3874e-819e-41b0-b500-45f66ba27fd7_1920x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:50064,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/168442302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b3874e-819e-41b0-b500-45f66ba27fd7_1920x1080.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!HxFu!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b3874e-819e-41b0-b500-45f66ba27fd7_1920x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!HxFu!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b3874e-819e-41b0-b500-45f66ba27fd7_1920x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!HxFu!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b3874e-819e-41b0-b500-45f66ba27fd7_1920x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!HxFu!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F31b3874e-819e-41b0-b500-45f66ba27fd7_1920x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One of the main values analytics engineers provide is building a robust system of data models that supports the decision making process of the business.</p><p>This system holds on four key principles:</p><ol><li><p>&#128200; scalability</p></li><li><p>&#9851;&#65039; reusability</p></li><li><p>&#9889;&#65039; performance</p></li><li><p>&#9989; data quality</p></li></ol><p>By focusing on all four, analytics engineers can build a truly remarkable analytical system that supports business stakeholders and data analysts, leading to faster insights and better decisions.</p><p>These four principles are interconnected. Progress on one will inevitably improve the others, as the boundaries between them are often blurry.</p><p>In this post series, I'll share practical tips on how to achieve each aspect of robust data modeling.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h2>&#128200; Scalability</h2><p>In analytics engineering, scalability is about <strong>handling changes with greater speed and confidence</strong>. This means data models should be designed for easy modification and extension.</p><p>In data world, requirements constantly evolve &#8212; new metrics, new dimensions, constantly changing business logic. The ability to quickly implement changes defines how scalable is your project.</p><p>Scalability also involves handling increased data volume, but we'll address that when discussing the performance aspects of analytical systems.</p><p>Several best practices can help achieve scalability.</p><h3>&#127828; Modeling layers abstraction</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!jDRk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0328a01-3b55-4f8e-b4b2-7efa249f5aa3_1920x627.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!jDRk!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0328a01-3b55-4f8e-b4b2-7efa249f5aa3_1920x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!jDRk!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0328a01-3b55-4f8e-b4b2-7efa249f5aa3_1920x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!jDRk!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0328a01-3b55-4f8e-b4b2-7efa249f5aa3_1920x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!jDRk!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0328a01-3b55-4f8e-b4b2-7efa249f5aa3_1920x627.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!jDRk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0328a01-3b55-4f8e-b4b2-7efa249f5aa3_1920x627.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0328a01-3b55-4f8e-b4b2-7efa249f5aa3_1920x627.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30438,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/168442302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0328a01-3b55-4f8e-b4b2-7efa249f5aa3_1920x627.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!jDRk!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0328a01-3b55-4f8e-b4b2-7efa249f5aa3_1920x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!jDRk!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0328a01-3b55-4f8e-b4b2-7efa249f5aa3_1920x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!jDRk!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0328a01-3b55-4f8e-b4b2-7efa249f5aa3_1920x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!jDRk!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0328a01-3b55-4f8e-b4b2-7efa249f5aa3_1920x627.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The first step in achieving scalability is organizing data pipeline&#8217;s assets into a system.</p><p>When transformation logic is just a pile of SQL and Python scripts hooked together, it's easy to get lost and make incorrect decisions about how to grow the system. There should be a clear pattern.</p><p>A classic example of such a pattern is the <a href="https://www.databricks.com/glossary/medallion-architecture">Medallion Architecture</a>.</p><p>It suggests organizing all the data in your data warehouse or data lake into three layers (Bronze, Silver, and Gold) to progressively improve data models:</p><ul><li><p><strong>Bronze</strong> layer represents raw data ingested from external sources</p></li><li><p><strong>Silver</strong> layer contains cleaned and validated data transformed from the Bronze layer, refined and cleaned of inconsistencies and errors</p></li><li><p><strong>Gold</strong> layer contains curated and enriched data ready to be used by analysts, data scientists, and Business Intelligence tools; usually denormalized and structured for efficient querying</p></li></ul><p>If you use dbt framework, another popular option is the <a href="https://docs.getdbt.com/best-practices/how-we-structure/1-guide-overview">modeling layers approach</a> from dbt Labs.</p><p>It suggests organizing data models into three basic layers:</p><ul><li><p><strong>Staging</strong> &#8212; to perform basic clean-up and alignment of raw data</p></li><li><p><strong>Intermediate</strong> &#8212; to build reusable building blocks that contain business logic</p></li><li><p><strong>Marts</strong> &#8212; for final and polished data marts ready for analysis</p></li></ul><p>Moreover, your models can be easily extended beyond these basic layers. For example, you can have reverse ETL layer, semantic models, and reporting layers. For inspiration, check how Gitlab structures their <a href="https://handbook.gitlab.com/handbook/enterprise-data/platform/edw/">data warehouse layers</a>.</p><p>Both approaches (medallion and modeling layers) share the same core idea: models should <strong>transform data from its raw state into a usable analytical model</strong> through progressive enhancements.</p><p>By logically organizing data models, we bring order to the project and ensure that changes can be implemented faster.</p><p><strong>Action points</strong>:</p><p>&#10067; Look at your analytics project and try to figure out if you are utilizing layers to gradually transform raw data into final analytcal tables</p><p>&#10060; If you don't see any notion of layering, think about how you can logically split all your data assets into layers to promote standardization</p><p>&#9989; If you're already using medallion architecture or modeling layers - you're on the right track!</p><h3>&#11088; Data modeling methodology</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!sLO4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd46c5d8-104d-4f1d-ab67-56fcd696f023_1920x627.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!sLO4!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd46c5d8-104d-4f1d-ab67-56fcd696f023_1920x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!sLO4!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd46c5d8-104d-4f1d-ab67-56fcd696f023_1920x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!sLO4!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd46c5d8-104d-4f1d-ab67-56fcd696f023_1920x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!sLO4!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd46c5d8-104d-4f1d-ab67-56fcd696f023_1920x627.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!sLO4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd46c5d8-104d-4f1d-ab67-56fcd696f023_1920x627.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bd46c5d8-104d-4f1d-ab67-56fcd696f023_1920x627.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26473,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/168442302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd46c5d8-104d-4f1d-ab67-56fcd696f023_1920x627.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!sLO4!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd46c5d8-104d-4f1d-ab67-56fcd696f023_1920x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!sLO4!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd46c5d8-104d-4f1d-ab67-56fcd696f023_1920x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!sLO4!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd46c5d8-104d-4f1d-ab67-56fcd696f023_1920x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!sLO4!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbd46c5d8-104d-4f1d-ab67-56fcd696f023_1920x627.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Although the term "data modeling" means different things depending on context, in this post we're specifically discussing data modeling for <em>analytics </em>purposes.</p><p>In the data world, data modeling methodology defines <strong>how data models are designed</strong> logically and subsequently implemented physically.</p><p>Several popular methodologies exist, including Kimball's modeling, Inmon's modeling, and Data Vault, and maybe some others.</p><p>In real projects, teams rarely use a pure implementation of any single approach. More commonly, they adopt a hybrid that borrows effective patterns from multiple methodologies.</p><p>For example, a popular approach is applying Kimball's dimensional modeling to business entities, like orders, users, or bookings. This helps create specific data models that serve business needs. Patterns such as &#8220;star schema&#8221; or &#8220;snowflake schema&#8221; help enforcing consistent physical design.</p><p>As a practical guidance on applying dimensional modeling in your analytics, I highly recommend the <strong>BEAM framework</strong> (Business Event Analysis &amp; Modeling).</p><p>This framework outlines how analytics engineers should iteratively build data models by:</p><ul><li><p>collaborating with business stakeholders</p></li><li><p>capturing essential details of future models</p></li><li><p>building models that are both useful and well-structured</p></li></ul><p>Here is <a href="https://www.youtube.com/watch?v=IwOR8WcYCDM">an awesome video</a> that explains implementation of BEAM in more details.</p><p>Integrating <strong>data modeling</strong> techniques with the <strong>modeling layers</strong> creates a more scalable architecture with exceptional clarity.</p><p>When you need to change logic or add a new data model, you'll know exactly where to make changes. New models typically go into the exposed layer (Gold or Marts) and then work backward through intermediate layers to raw data. Existing models are easily adjustable because dimensional modeling promotes modularity and clear relationships between entities.</p><p><strong>Action points</strong>:</p><p>&#10067; Review your data models, especially the final layer that contains business-facing tables</p><p>&#10060; If you see a set of disconnected tables that don't have clear relationships or contain partially duplicated logic &#8212; rethink your approach, try Model-storming exercise from the BEAM framework to see if you can unify your models</p><p>&#9989; If you see well-organized marts that are easy to join and work with &#8212; nicely done!</p><h3>&#129521; Naming and coding conventions</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!hFYO!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff095d298-d39d-4b6d-980c-ab527a7cd0ef_1920x627.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!hFYO!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff095d298-d39d-4b6d-980c-ab527a7cd0ef_1920x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!hFYO!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff095d298-d39d-4b6d-980c-ab527a7cd0ef_1920x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!hFYO!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff095d298-d39d-4b6d-980c-ab527a7cd0ef_1920x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!hFYO!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff095d298-d39d-4b6d-980c-ab527a7cd0ef_1920x627.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!hFYO!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff095d298-d39d-4b6d-980c-ab527a7cd0ef_1920x627.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f095d298-d39d-4b6d-980c-ab527a7cd0ef_1920x627.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:26680,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/168442302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff095d298-d39d-4b6d-980c-ab527a7cd0ef_1920x627.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!hFYO!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff095d298-d39d-4b6d-980c-ab527a7cd0ef_1920x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!hFYO!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff095d298-d39d-4b6d-980c-ab527a7cd0ef_1920x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!hFYO!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff095d298-d39d-4b6d-980c-ab527a7cd0ef_1920x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!hFYO!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff095d298-d39d-4b6d-980c-ab527a7cd0ef_1920x627.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This simple technique brings significant order to all analytics projects.</p><p>It's about <strong>consistently naming things</strong> and using the same <strong>coding conventions</strong> throughout your codebase.</p><p>This reduces cognitive load, allowing you to focus more on business logic more than worrying about file naming.</p><p>The same principle applies to files organization. Files that properly arranged into layers naturally indicate where to create new models or locate existing ones.</p><p>Organized systems tend to stay organized.</p><p>Additionally, properly organized files are easier to maintain and simplify the onboarding process for new team members.</p><p>Take inspiration from the <a href="https://docs.getdbt.com/best-practices/how-we-structure/2-staging">same guide</a> from dbt Labs about modeling layers:</p><ul><li><p>Base layers sit at the top of your project (e.g., <em>/stagin</em>g, <em>/intermediate</em>s, <em>/marts</em>)</p></li><li><p>Within each layer, files are organized either by source for staging models (e.g., <em>facebook</em>, <em>postgres</em>, <em>salesforce</em>) or by business domain in intermediate or marts layers (e.g., <em>product</em>, <em>finance</em>, <em>marketing</em>, <em>core</em>)</p></li><li><p>Files follow specific naming conventions, such as prefixing with <em>stg_</em> in the staging layer, <em>int_</em> for intermediates, or <em>fct_/dim_</em> for marts</p></li></ul><p><strong>Action points</strong>:</p><p>&#10067; Review existing coding and naming conventions for your projects</p><p>&#10060; If you don't have any &#8212; it's time to design them! Sit with the team and discuss how you can standardize the naming and coding conventions</p><p>&#9989; Already having strong conventions? Try utilizing tools like <a href="https://sqlfluff.com/">SQLFluff</a>, <a href="https://github.com/astral-sh/ruff">Ruff</a> or other specialized packages to check your existing codebase and enforce the standards within the team!</p><h2>&#9851;&#65039; Reusability</h2><p>The second vital pillar of a robust data modeling system is reusability.</p><p>Reusability enables you to <strong>build new models on top of existing ones</strong>, eliminating the need to grow the number of models. You leverage code that has already been built and tested. This approach allows you to write less new code overall.</p><p>Here are a few approaches to achieve reusability in your project.</p><h3>&#128230; Build Once, Use everywhere</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!h4-7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd535da3e-96f4-42ac-b4d6-2b4e4030b4d6_1920x627.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!h4-7!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd535da3e-96f4-42ac-b4d6-2b4e4030b4d6_1920x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!h4-7!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd535da3e-96f4-42ac-b4d6-2b4e4030b4d6_1920x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!h4-7!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd535da3e-96f4-42ac-b4d6-2b4e4030b4d6_1920x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!h4-7!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd535da3e-96f4-42ac-b4d6-2b4e4030b4d6_1920x627.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!h4-7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd535da3e-96f4-42ac-b4d6-2b4e4030b4d6_1920x627.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d535da3e-96f4-42ac-b4d6-2b4e4030b4d6_1920x627.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34752,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/168442302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd535da3e-96f4-42ac-b4d6-2b4e4030b4d6_1920x627.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!h4-7!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd535da3e-96f4-42ac-b4d6-2b4e4030b4d6_1920x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!h4-7!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd535da3e-96f4-42ac-b4d6-2b4e4030b4d6_1920x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!h4-7!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd535da3e-96f4-42ac-b4d6-2b4e4030b4d6_1920x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!h4-7!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd535da3e-96f4-42ac-b4d6-2b4e4030b4d6_1920x627.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The first principle is very straightforward &#8212; when creating a data model, think ahead about potential usage of that model beyond your current scope.</p><p>Quite often you might find yourself needing the same functionality <em>over and over</em> again. So instead of copy-pasting the code, you could implement a model that can be reused many times.</p><p>The main principle of reusable models is modularity and single-purpose responsibility.</p><p>General rule: <strong>one model = one responsibility</strong>.</p><p>Don't build overly complicated models that encapsulate a lot of logic. Such models are over-engineered and may be hard to reuse due to complexity or performance issues.</p><p>A particular red flag is having over-loaded intermediate models. Intermediate models need to be small building blocks, not final tables with all possible business logic.</p><p>Not only models can be modularized, but pieces of code as well. For example, in dbt you can use <a href="https://docs.getdbt.com/docs/build/jinja-macros">Jinja macros</a> to create snippets with repeated logic. Things like currency or timestamp conversions, complex CASE statements, etc. can be encapsulated and reused across the project.</p><p><strong>Action points</strong>:</p><p>&#10067; Search for data models in your project that are different yet have a lot of overlapping logic</p><p>&#10060; It&#8217;s probably hard to refactor all repeated models at once, so first good step is just creating a backlog of such models</p><p>&#9989; Start tackling the backlog as a second step, gradually cleaning up your DAG and making it more straightforward</p><p>&#128516; Fun fact: we used a metric called "number of screenshots required to capture a DAG" to measure how well we improved our models. We went from 8 to 3 screenshots after six months of work!</p><h3>&#11013;&#65039; Shift Left</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!lXgI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F126096c6-0005-4dac-8247-df1722a20a0d_1920x627.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!lXgI!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F126096c6-0005-4dac-8247-df1722a20a0d_1920x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!lXgI!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F126096c6-0005-4dac-8247-df1722a20a0d_1920x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!lXgI!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F126096c6-0005-4dac-8247-df1722a20a0d_1920x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!lXgI!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F126096c6-0005-4dac-8247-df1722a20a0d_1920x627.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!lXgI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F126096c6-0005-4dac-8247-df1722a20a0d_1920x627.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/126096c6-0005-4dac-8247-df1722a20a0d_1920x627.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:17741,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/168442302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F126096c6-0005-4dac-8247-df1722a20a0d_1920x627.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!lXgI!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F126096c6-0005-4dac-8247-df1722a20a0d_1920x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!lXgI!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F126096c6-0005-4dac-8247-df1722a20a0d_1920x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!lXgI!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F126096c6-0005-4dac-8247-df1722a20a0d_1920x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!lXgI!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F126096c6-0005-4dac-8247-df1722a20a0d_1920x627.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The second popular approach to increase reusability is called "shift left."</p><p>This means <strong>implementing changes as early as possible</strong> in the data pipeline so they can be easily reused by all downstream models.</p><p>For example, if your &#8220;users&#8221; table contains <em>first_name</em> and <em>last_name</em> fields, and you frequently concatenate them to get the <em>full_name</em> in your data marts, this transformation is a good candidate to "shift left" to the staging model, making it available for everyone.</p><p>While this may sound trivial, I often find myself reinventing the same formula or dimension repeatedly in data marts when the better solution would be to push this calculation as far left as possible in the DAG.</p><p>Great examples of the &#8220;shifted left&#8221; pieces:</p><ul><li><p>Mathematical formulas (e.g., calculating tax rates)</p></li><li><p>Timestamp conversions and unification</p></li><li><p>Implementation of CASE statements logic</p></li><li><p>Logic that requires JOINs (usually in intermediate models)</p></li></ul><p>Another advantage of this approach is traceability. When all downstream processes use the same formula from upstream source, it becomes much easier to troubleshoot and backtrack changes to their source.</p><p><strong>Action points</strong>:</p><p>&#10067; When working with data marts, start noticing similar (derived) columns that span across multiple models and check</p><p>&#10060; Are they coming from a single calculation upstream? If not, shift them left!</p><p>&#9989; In many cases, reusable logic can be shifted up to the staging layer, significantly reducing the number of copy-pasted pieces in downstream models</p><h3>&#128221; Document your models</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!J8D0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47854f1d-facd-4f63-9e3a-64ab4e4fba3a_1920x627.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!J8D0!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47854f1d-facd-4f63-9e3a-64ab4e4fba3a_1920x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!J8D0!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47854f1d-facd-4f63-9e3a-64ab4e4fba3a_1920x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!J8D0!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47854f1d-facd-4f63-9e3a-64ab4e4fba3a_1920x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!J8D0!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47854f1d-facd-4f63-9e3a-64ab4e4fba3a_1920x627.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!J8D0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47854f1d-facd-4f63-9e3a-64ab4e4fba3a_1920x627.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/47854f1d-facd-4f63-9e3a-64ab4e4fba3a_1920x627.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:25217,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/168442302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47854f1d-facd-4f63-9e3a-64ab4e4fba3a_1920x627.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!J8D0!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47854f1d-facd-4f63-9e3a-64ab4e4fba3a_1920x627.png 424w, /__u/substackcdn.com/image/fetch/$s_!J8D0!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47854f1d-facd-4f63-9e3a-64ab4e4fba3a_1920x627.png 848w, /__u/substackcdn.com/image/fetch/$s_!J8D0!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47854f1d-facd-4f63-9e3a-64ab4e4fba3a_1920x627.png 1272w, /__u/substackcdn.com/image/fetch/$s_!J8D0!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47854f1d-facd-4f63-9e3a-64ab4e4fba3a_1920x627.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Including documentation in the Reusability section might seem unexpected, but stay with me on this one.</p><p>Engineers often create redundant models simply because they're unaware of existing models that could meet their needs. And this is where a <strong>comprehensive documentation can prevent creating redundancy</strong> by making existing models more discoverable and more understandable.</p><p>Effective documentation clearly states the purpose of the model, applied filters, limitations, and edge cases. Also, by reusing existing models you benefit from the experience of the model&#8217;s developer, who probably handled edge cases and unusual data behaviors.</p><p>Of course, if an existing model only meets 10-20% of your requirements, creating a new one is preferable. After creating a new model, document it and maybe explain why you chose creating a new model instead of extending an existing model.</p><p>Well-documented models, combined with proper organization (using the layers and naming conventions discussed earlier), can significantly reduce redundant code and enhance reusability across your analytics ecosystem.</p><p><strong>Action points</strong>:</p><p>&#10067; Review the documentation coverage and its quality: do all models have descriptions that clearly explain their purpose?</p><p>&#10060; If documentation is sparse or unclear, prioritize documenting the most frequently used models first</p><p>&#9989; Consider implementing a documentation conventions, like including model's purpose, limitations, and usage examples</p><h2>To be continued</h2><p>In <a href="/__u/dbtips.substack.com/p/the-core-principles-of-robust-data-480">the next post</a> I'll talk about the last two principles of robust data modeling: performance and data quality.</p><p>Make sure to subscribe here or <a href="https://www.linkedin.com/in/oleg-agapov/">on LinkedIn</a> to not miss the second part!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Og4U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 424w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 848w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Og4U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png" width="415" height="415" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:415,&quot;bytes&quot;:2752273,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://dbtips.substack.com/i/168442302?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 424w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 848w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Og4U!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f97561f-ccc8-424e-9b45-5960a411b1d9_1702x1702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dbtips.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Debugging Errors in dbt: A Survival Guide]]></title><description><![CDATA[print("here")]]></description><link>https://dbtips.substack.com/p/debugging-errors-in-dbt-a-survival</link><guid isPermaLink="false">https://dbtips.substack.com/p/debugging-errors-in-dbt-a-survival</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Sun, 02 Feb 2025 00:24:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2E0p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbcd230b-1601-4346-b6dd-5d31460a88d3_2560x1440.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!2E0p!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbcd230b-1601-4346-b6dd-5d31460a88d3_2560x1440.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!2E0p!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbcd230b-1601-4346-b6dd-5d31460a88d3_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!2E0p!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbcd230b-1601-4346-b6dd-5d31460a88d3_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!2E0p!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbcd230b-1601-4346-b6dd-5d31460a88d3_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!2E0p!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbcd230b-1601-4346-b6dd-5d31460a88d3_2560x1440.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!2E0p!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbcd230b-1601-4346-b6dd-5d31460a88d3_2560x1440.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cbcd230b-1601-4346-b6dd-5d31460a88d3_2560x1440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:152089,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!2E0p!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbcd230b-1601-4346-b6dd-5d31460a88d3_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!2E0p!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbcd230b-1601-4346-b6dd-5d31460a88d3_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!2E0p!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbcd230b-1601-4346-b6dd-5d31460a88d3_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!2E0p!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcbcd230b-1601-4346-b6dd-5d31460a88d3_2560x1440.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Have you ever encountered a mysterious error while working on a dbt project and couldn't figure out its source? I've been there too.</p><p>Some errors are easy to fix &#8212; usually caused by that one tiny change you just made. But others? Sometimes you may face puzzling issues that seem to originate from somewhere outside of your modifications (though I suspect they rarely do &#128521;).</p><p>Let&#8217;s break down how to solve them before they drive you crazy.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h1><strong>Types of errors in dbt (and how to outsmart them)</strong></h1><p>First of all, there are basically only four four types of errors in dbt. Let's explore them.</p><h3><strong>&#128640; Runtime Errors &#8211; The "Something is Off" Error</strong></h3><p><strong>When does it happen?</strong> When your project setup is incorrect.</p><p>&#128295; <strong>Fix it by:</strong></p><ul><li><p>Running <em>dbt debug</em> to check for <a href="https://docs.getdbt.com/reference/commands/debug">general issues</a> with the project, like missing profiles or broken database connection.</p></li><li><p>Ensuring you're inside the correct dbt project folder (this is where your <em>dbt_project.yml</em> file is).</p></li><li><p>Checking your <em>profiles.yml</em> file for the correct profile name.</p></li><li><p>Verifying <a href="https://docs.getdbt.com/reference/database-permissions/about-database-permissions">database permissions</a>.</p></li></ul><p>Usually you encounter these when you're setting up the project for the first time. But once everything is connected, you likely won't see these anymore.</p><div><hr></div><h3><strong>&#128260; Database Errors &#8211; When SQL Says &#8216;Nope&#8217;</strong></h3><p><strong>When does it happen?</strong> When dbt tries to execute SQL that the database doesn&#8217;t like.</p><p>&#128295; <strong>How to fix it:</strong></p><ul><li><p>Try to <a href="https://docs.getdbt.com/reference/commands/compile">compile the model</a> with <em>dbt compile</em> command and execute the result in database directly. The command will output the compiled code directly to your terminal!</p></li><li><p>Alternatively, look inside the <em>/target</em> folder for compiled SQL and test it in your database.</p></li><li><p>Run your commands with the <em>--debug</em> flag for <a href="https://docs.getdbt.com/reference/global-configs/logs#debug-level-logging">extra details</a> (more on that later in the post).</p></li></ul><p>In my opinion, these errors happen most often. Luckily, they are also the easiest to fix, since they are originating from SQL code you write.</p><div><hr></div><h3><strong>&#9888;&#65039; Compilation Errors &#8211; Jinja and YAML Gotchas</strong></h3><p><strong>When does it happen?</strong> When dbt struggles to parse your Jinja or YAML code</p><p>&#128295; <strong>Fix it by:</strong></p><ul><li><p>Checking for invalid Jinja syntax. Maybe you forgot to close a curly bracket or made a type in macro name.</p></li><li><p>Ensuring referenced models actually exist.</p></li><li><p>Validating that your YAML files are correctly formatted. YAML syntax is also sensitive to margins.</p></li></ul><p>Happens from time to time, but usually dbt can tell you exactly where the issue is.</p><div><hr></div><h3><strong>&#128279; Dependency Errors &#8211; The &#8216;Circular Nightmare&#8217;</strong></h3><p><strong>When does it happen?</strong> When your models reference each other in a loop or have broken dependencies.</p><p>&#128295; <strong>How to fix it:</strong></p><ul><li><p>Hunt for circular dependencies and break the loop. If the loop seems unbreakable, maybe you could introduce an intermediate model to get out.</p></li><li><p>If a model needs to reference itself, use the <a href="https://docs.getdbt.com/reference/dbt-jinja-functions/this">{{ this }}</a> macro, not the <em>ref()</em></p></li></ul><p>Easiest problem to understand, but sometimes the hardest to resolve.</p><div><hr></div><h1><strong>Debugging like a pro</strong></h1><p><strong>1&#65039;&#8419; Use the --debug Flag</strong></p><p>dbt hides a lot of details in normal runs, but adding <em>--debug</em> unlocks more insights:</p><pre><code><code>dbt --debug run</code></code></pre><p>Now you can see exactly what dbt is doing behind the scenes. This also works for <em>test</em> and <em>build</em> commands.</p><p><strong>2&#65039;&#8419; Debugging Macros</strong></p><p>Macros can feel like a black box, but here&#8217;s how to crack them open:</p><ul><li><p><strong>Compile the macro separately</strong> to see what SQL it generates:</p></li></ul><pre><code><code>dbt compile --inline "{{ macro_name(params) }}"</code></code></pre><ul><li><p><strong>Use </strong><em><strong>log()</strong></em><strong> statements</strong> to print out variables and debug step by step:</p></li></ul><pre><code><code>{{ log("Reached here", info=true) }}
{{ log(variable_name, info=true) }}</code></code></pre><ul><li><p><strong>Use the built-in Jinja </strong><em><strong>debug()</strong></em><strong> macro</strong> like a breakpoint. This will open an interactive iPython debugger where you can inspect variables.</p></li></ul><pre><code><code>{% my_macro() %} 

... your macro code
{{ debug() }}

{% endmacro %}</code></code></pre><div><hr></div><h3><strong>The Future of Debugging in dbt</strong></h3><p>With dbt&#8217;s recent <a href="https://www.getdbt.com/blog/dbt-labs-acquires-sdf-labs">acquisition of SDF Labs</a>, a new SQL parser is on the way. This means syntax errors could be caught before even running queries &#8212; exciting times ahead! But until that feature arrives, these debugging techniques should keep you sane.</p><p>What&#8217;s the weirdest dbt error you&#8217;ve encountered? Let me know about your horror stories in the comments! &#128123;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="/__u/dbtips.substack.com/subscribe"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Running dbt with Airflow]]></title><description><![CDATA[Several ways to run dbt pipelines with Apache Airflow]]></description><link>https://dbtips.substack.com/p/running-dbt-with-airflow</link><guid isPermaLink="false">https://dbtips.substack.com/p/running-dbt-with-airflow</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Mon, 16 Sep 2024 05:51:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9Qlh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3511856-fd39-4ef1-9d01-088cac5a4ce4_2560x1440.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!9Qlh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3511856-fd39-4ef1-9d01-088cac5a4ce4_2560x1440.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!9Qlh!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3511856-fd39-4ef1-9d01-088cac5a4ce4_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!9Qlh!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3511856-fd39-4ef1-9d01-088cac5a4ce4_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!9Qlh!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3511856-fd39-4ef1-9d01-088cac5a4ce4_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!9Qlh!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3511856-fd39-4ef1-9d01-088cac5a4ce4_2560x1440.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!9Qlh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3511856-fd39-4ef1-9d01-088cac5a4ce4_2560x1440.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3511856-fd39-4ef1-9d01-088cac5a4ce4_2560x1440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:184168,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!9Qlh!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3511856-fd39-4ef1-9d01-088cac5a4ce4_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!9Qlh!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3511856-fd39-4ef1-9d01-088cac5a4ce4_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!9Qlh!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3511856-fd39-4ef1-9d01-088cac5a4ce4_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!9Qlh!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3511856-fd39-4ef1-9d01-088cac5a4ce4_2560x1440.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Apache Airflow is a very popular orchestration tool in the data engineering world. One question that often arises in many teams is: "Is it possible to run dbt pipelines with Airflow?" Of course it is, and I'm going to show you how to implement this in practice.</p><p>Since Airflow is an open-source tool, there's no single "correct" way of integrating the two tools. Different teams may integrate them differently and even create their own integrations to serve specific requirements.</p><p>In this post, I'll show you two ways (+ one bonus way) of integrating them together. One way is simple and straightforward. The other is more custom and requires an additional package to be installed in your Airflow environment. Let's get started!</p><blockquote><p>All code for his post you can find in <a href="https://github.com/oleg-agapov/dbt-with-airflow">this repository</a>!</p></blockquote><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>Option 1: Naive approach</h1><p>The naive approach is straightforward and doesn't require external packages to be installed. However, since dbt itself is a Python package, you'll need to add it to your Airflow dependencies.</p><p>Once that's done, you can simply create a DAG that uses BashOperator to trigger dbt commands. Here's a <a href="https://github.com/oleg-agapov/dbt-with-airflow/blob/main/dags/dbt-with-bash-operator.py">sample code</a> that runs three dbt commands: seed, run, and test:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Nyxa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66af6264-2216-4976-b7f0-3503024cf01e_3760x3412.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Nyxa!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66af6264-2216-4976-b7f0-3503024cf01e_3760x3412.png 424w, /__u/substackcdn.com/image/fetch/$s_!Nyxa!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66af6264-2216-4976-b7f0-3503024cf01e_3760x3412.png 848w, /__u/substackcdn.com/image/fetch/$s_!Nyxa!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66af6264-2216-4976-b7f0-3503024cf01e_3760x3412.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Nyxa!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66af6264-2216-4976-b7f0-3503024cf01e_3760x3412.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Nyxa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66af6264-2216-4976-b7f0-3503024cf01e_3760x3412.png" width="1456" height="1321" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/66af6264-2216-4976-b7f0-3503024cf01e_3760x3412.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1321,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1685316,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Nyxa!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66af6264-2216-4976-b7f0-3503024cf01e_3760x3412.png 424w, /__u/substackcdn.com/image/fetch/$s_!Nyxa!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66af6264-2216-4976-b7f0-3503024cf01e_3760x3412.png 848w, /__u/substackcdn.com/image/fetch/$s_!Nyxa!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66af6264-2216-4976-b7f0-3503024cf01e_3760x3412.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Nyxa!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66af6264-2216-4976-b7f0-3503024cf01e_3760x3412.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There are a few important points to pay attention to.</p><p>First, ensure you specify the correct paths to your dbt project folder and the folder containing dbt profiles. Since there's no standard location for a dbt project, it could be in any subfolder of your Airflow repository. By using the flags <em>--project-dir</em> and <em>--profiles-dir</em>, we ensure that the dbt CLI uses the correct path to the project.</p><p>Second, as you've likely figured out from the previous point, you'll need to commit <em>profiles.yml</em> to the repository. Don't worry &#8212; there's no need to store your credentials there. You can simply read <a href="https://docs.getdbt.com/reference/dbt-jinja-functions/env_var">environment variables</a> to make it work.</p><p>With such simple setup you get a simple way to run dbt models from Airflow:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!7p69!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ee66e16-3f07-4bed-bafa-32b00368948e_1324x773.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!7p69!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ee66e16-3f07-4bed-bafa-32b00368948e_1324x773.png 424w, /__u/substackcdn.com/image/fetch/$s_!7p69!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ee66e16-3f07-4bed-bafa-32b00368948e_1324x773.png 848w, /__u/substackcdn.com/image/fetch/$s_!7p69!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ee66e16-3f07-4bed-bafa-32b00368948e_1324x773.png 1272w, /__u/substackcdn.com/image/fetch/$s_!7p69!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ee66e16-3f07-4bed-bafa-32b00368948e_1324x773.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!7p69!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ee66e16-3f07-4bed-bafa-32b00368948e_1324x773.png" width="1324" height="773" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7ee66e16-3f07-4bed-bafa-32b00368948e_1324x773.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:773,&quot;width&quot;:1324,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:120714,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!7p69!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ee66e16-3f07-4bed-bafa-32b00368948e_1324x773.png 424w, /__u/substackcdn.com/image/fetch/$s_!7p69!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ee66e16-3f07-4bed-bafa-32b00368948e_1324x773.png 848w, /__u/substackcdn.com/image/fetch/$s_!7p69!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ee66e16-3f07-4bed-bafa-32b00368948e_1324x773.png 1272w, /__u/substackcdn.com/image/fetch/$s_!7p69!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7ee66e16-3f07-4bed-bafa-32b00368948e_1324x773.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>However, there are several fundamental flaws with this option.</p><p>The main drawback is the monolithic architecture of the pipeline. You can't see the same DAG of models in Airflow as you do in dbt documentation. This means that if one model or test fails, you have to re-run the entire pipeline, as there's no way to pick up from the failure point.</p><p>Additionally, installing dbt alongside Airflow's main dependencies may lead to conflicts.</p><p>The need to commit <em>profiles.yml</em> to the repository also adds complexity. Wouldn't it be great to simply reuse connections from Airflow to run the dbt pipeline?</p><p>That's why the folks at Astronomer implemented a package called astronomer-cosmos that can tackle these limitations.</p><h1>Option 2: Astronomer-cosmos package</h1><p>The Astronomer-cosmos package for Apache Airflow enables you to run dbt Core projects as Airflow DAGs and Task Groups.</p><p>According to its developers, this approach offers several benefits:</p><ul><li><p>Run dbt projects against Airflow connections instead of dbt profiles</p></li><li><p>Ability to install dbt in a separate virtual environment to avoid dependency conflicts with Airflow</p></li><li><p>Simulate dbt build command by running tests immediately after a model is done to catch issues early</p></li><li><p>Use Airflow&#8217;s sensors to immediately run models after upstream ingestion</p></li><li><p>Turn each dbt model into a task/task group and configure retries, alerting, etc.</p></li></ul><p>Here is a very <a href="https://github.com/oleg-agapov/dbt-with-airflow/blob/main/dags/dbt-with-cosmos.py">simple code</a> that can get you started:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!eQWV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F686718ce-8c70-4b7a-b7fd-850955f5c331_3736x2912.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!eQWV!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F686718ce-8c70-4b7a-b7fd-850955f5c331_3736x2912.png 424w, /__u/substackcdn.com/image/fetch/$s_!eQWV!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F686718ce-8c70-4b7a-b7fd-850955f5c331_3736x2912.png 848w, /__u/substackcdn.com/image/fetch/$s_!eQWV!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F686718ce-8c70-4b7a-b7fd-850955f5c331_3736x2912.png 1272w, /__u/substackcdn.com/image/fetch/$s_!eQWV!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F686718ce-8c70-4b7a-b7fd-850955f5c331_3736x2912.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!eQWV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F686718ce-8c70-4b7a-b7fd-850955f5c331_3736x2912.png" width="1456" height="1135" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/686718ce-8c70-4b7a-b7fd-850955f5c331_3736x2912.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1135,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1512978,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!eQWV!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F686718ce-8c70-4b7a-b7fd-850955f5c331_3736x2912.png 424w, /__u/substackcdn.com/image/fetch/$s_!eQWV!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F686718ce-8c70-4b7a-b7fd-850955f5c331_3736x2912.png 848w, /__u/substackcdn.com/image/fetch/$s_!eQWV!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F686718ce-8c70-4b7a-b7fd-850955f5c331_3736x2912.png 1272w, /__u/substackcdn.com/image/fetch/$s_!eQWV!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F686718ce-8c70-4b7a-b7fd-850955f5c331_3736x2912.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As you can see, you'll need to provide a few configuration options.</p><p>Similar to the previous example, configure a full path to the dbt project. Additionally, in the <em>execution_config</em>, you should add a path to the dbt executable (in case it's in a separate virtual environment).</p><p>The profile_config variable contains settings for dbt profiles. Here, you can either use a path to <em>profiles.yml</em> (similar to the previous example) or use a connection from Airflow, in this case to Snowflake.</p><p>The <em>DbtDag</em> is a wrapper class that splits each model into a separate task, like so:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Lt4d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c98711-a9a2-4b65-98c5-499fd4dc7948_1957x949.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Lt4d!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c98711-a9a2-4b65-98c5-499fd4dc7948_1957x949.png 424w, /__u/substackcdn.com/image/fetch/$s_!Lt4d!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c98711-a9a2-4b65-98c5-499fd4dc7948_1957x949.png 848w, /__u/substackcdn.com/image/fetch/$s_!Lt4d!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c98711-a9a2-4b65-98c5-499fd4dc7948_1957x949.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Lt4d!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c98711-a9a2-4b65-98c5-499fd4dc7948_1957x949.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Lt4d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c98711-a9a2-4b65-98c5-499fd4dc7948_1957x949.png" width="1456" height="706" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28c98711-a9a2-4b65-98c5-499fd4dc7948_1957x949.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:706,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:209731,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Lt4d!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c98711-a9a2-4b65-98c5-499fd4dc7948_1957x949.png 424w, /__u/substackcdn.com/image/fetch/$s_!Lt4d!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c98711-a9a2-4b65-98c5-499fd4dc7948_1957x949.png 848w, /__u/substackcdn.com/image/fetch/$s_!Lt4d!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c98711-a9a2-4b65-98c5-499fd4dc7948_1957x949.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Lt4d!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28c98711-a9a2-4b65-98c5-499fd4dc7948_1957x949.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As you can see in the screenshot, each model task is followed by another task with tests for that model. This approach provides behavior similar to the dbt build command.</p><p>You can configure the DAG in many ways.</p><p>Using the <em>DbtTaskGroup</em> class, you can integrate dbt as a step within a more complex DAG. The render_config option allows you to make node selections for models, seeds, tags, and more. You can find all these examples in the demo repository: <a href="https://github.com/astronomer/cosmos-demo/tree/main">https://github.com/astronomer/cosmos-demo/tree/main</a></p><h2>Bonus: using Airflow with dbt Cloud</h2><p>If you're using dbt Cloud and want to leverage Airflow's scheduling capabilities, you can do so with the help of an official package. This package enables you to submit dbt jobs, check job results, and download artifacts. By combining Airflow with dbt Cloud, you can create a highly customized data pipeline tailored to your specific use case.</p><p><a href="https://airflow.apache.org/docs/apache-airflow-providers-dbt-cloud/stable/index.html">The package</a> can be installed as:</p><pre><code><code>pip install apache-airflow-providers-dbt-cloud[http]</code></code></pre><p>To connect to dbt Cloud, you need to generate a <a href="https://docs.getdbt.com/docs/dbt-cloud-apis/service-tokens">service token</a>. This token, along with your account ID and URL (found in Settings &#8594; Account), can be stored in Airflow&#8217;s connections. Alternatively, provide credentials as an environment variable:</p><pre><code><code>export AIRFLOW_CONN_DBT_CLOUD_DEFAULT='dbt-cloud://account_id:secret_token@my-urlgetdbt.com'</code></code></pre><p>Here is a <a href="https://github.com/oleg-agapov/dbt-with-airflow/blob/main/dags/dbt-cloud-dag.py">simple DAG</a> that can trigger dbt job from dbt Cloud:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!NMNj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e0e2851-1536-44ae-9519-dd84594cd82c_3736x2856.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!NMNj!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e0e2851-1536-44ae-9519-dd84594cd82c_3736x2856.png 424w, /__u/substackcdn.com/image/fetch/$s_!NMNj!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e0e2851-1536-44ae-9519-dd84594cd82c_3736x2856.png 848w, /__u/substackcdn.com/image/fetch/$s_!NMNj!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e0e2851-1536-44ae-9519-dd84594cd82c_3736x2856.png 1272w, /__u/substackcdn.com/image/fetch/$s_!NMNj!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e0e2851-1536-44ae-9519-dd84594cd82c_3736x2856.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!NMNj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e0e2851-1536-44ae-9519-dd84594cd82c_3736x2856.png" width="1456" height="1113" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8e0e2851-1536-44ae-9519-dd84594cd82c_3736x2856.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1113,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1396383,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!NMNj!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e0e2851-1536-44ae-9519-dd84594cd82c_3736x2856.png 424w, /__u/substackcdn.com/image/fetch/$s_!NMNj!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e0e2851-1536-44ae-9519-dd84594cd82c_3736x2856.png 848w, /__u/substackcdn.com/image/fetch/$s_!NMNj!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e0e2851-1536-44ae-9519-dd84594cd82c_3736x2856.png 1272w, /__u/substackcdn.com/image/fetch/$s_!NMNj!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8e0e2851-1536-44ae-9519-dd84594cd82c_3736x2856.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This DAG simply triggers a dbt job configured in dbt Cloud environment. It also is possible to make this task <em>DbtCloudRunJobOperator</em> asyncronous by providing <em>wait_for_termination=False</em> argument.</p><div><hr></div><p><em><strong>If you liked this issue please subscribe and share it with your colleagues, this greatly helps me developing this newsletter!</strong></em></p><p>See you next time &#128075;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to #dbtips!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Testing data sources in dbt]]></title><description><![CDATA[Best practices and testing strategies]]></description><link>https://dbtips.substack.com/p/testing-data-sources-in-dbt</link><guid isPermaLink="false">https://dbtips.substack.com/p/testing-data-sources-in-dbt</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Mon, 24 Jun 2024 02:31:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!nxzB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf734a0e-679c-4f29-b58d-224b6be0359c_2560x1440.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!nxzB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf734a0e-679c-4f29-b58d-224b6be0359c_2560x1440.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!nxzB!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf734a0e-679c-4f29-b58d-224b6be0359c_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!nxzB!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf734a0e-679c-4f29-b58d-224b6be0359c_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!nxzB!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf734a0e-679c-4f29-b58d-224b6be0359c_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nxzB!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf734a0e-679c-4f29-b58d-224b6be0359c_2560x1440.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!nxzB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf734a0e-679c-4f29-b58d-224b6be0359c_2560x1440.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/af734a0e-679c-4f29-b58d-224b6be0359c_2560x1440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:210470,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!nxzB!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf734a0e-679c-4f29-b58d-224b6be0359c_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!nxzB!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf734a0e-679c-4f29-b58d-224b6be0359c_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!nxzB!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf734a0e-679c-4f29-b58d-224b6be0359c_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!nxzB!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Faf734a0e-679c-4f29-b58d-224b6be0359c_2560x1440.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A common question for data professionals is, "When was the data/dashboard last updated?" The answer often involves checking the <em>created_at</em> or <em>updated_at</em> columns in your data models for the latest timestamp. However, this might not be entirely accurate, as your models are only as fresh as your data source is.</p><p>Another critical aspect of data modeling is ensuring the quality of your source data. The saying "garbage in, garbage out" is relevant here. Even flawless SQL models won't compensate for poor incoming data quality.</p><p>Therefore, it's crucial to invest time in setting up proper data quality testing for your data sources. This will help reduce errors in your final dashboards. Let's explore how to accomplish this with dbt.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>Freshness tests</h1><p>A <a href="https://docs.getdbt.com/docs/deploy/source-freshness">freshness test</a> is a simple test you can perform on your data sources. As the name implies, it checks the freshness of the data sources, alerting you about stale or outdated data.</p><p>The method dbt uses to check freshness is simple. The first step is to check the timestamp of the last row loaded into the source table. Then, calculate the difference between last available timestamp and the current time. With this difference, dbt can tell you whether your data is considered stale or not. As different tables may have varying refresh intervals, you can set individual thresholds for each one.</p><p>Basic configuration for setting up a freshness test looks like this:</p><pre><code><code>sources:
  - name: stripe
    database: raw_data
    schema: stripe
    tables:
      - name: charges
        freshness:
          warn_after: { count: 1, period: day }
          error_after: { count: 2, period: day }
&#9;  loaded_at_field: loaded_at</code></code></pre><p>This config means the following:</p><ul><li><p>we are checking charges table for <strong>freshness</strong></p></li><li><p>dbt will raise a <strong>warning</strong> if the data is 1 day old</p></li><li><p>it will alert an <strong>error</strong> if the data is 2 days stale</p></li><li><p>lastly, we specify that <strong>loaded_at</strong> is a timestamp column that has to be checked for freshness</p></li></ul><p>You can tweak this config in several ways. For example, you may add freshness block to the source level (instead of each individual tables). In that case same data freshness rules will be applied to all tables.</p><p>Another improvement is to add <em>filter</em> parameter and limit the amount of scanned rows to only last week or so (use syntax of your database here):</p><pre><code><code>freshness:
  error_after: { count: 1, period: day }
  filter: datediff('day', loaded_at, current_timestamp) &lt;= 7</code></code></pre><p>To trigger freshness tests you need to run command:</p><pre><code><code>dbt source freshness</code></code></pre><p>If you need to run freshness tests only for specific sources/tables, you could use node selection syntax:</p><pre><code><code># check all tables in the source named "stripe"
dbt source freshness --select source:stripe

# check "charges" table only
dbt source freshness --select source:stripe.charges</code></code></pre><p>How often should you perform freshness tests? Aim to conduct them before each model run to confirm you're not using stale data. However, you might want to do it more frequently because freshness tests are separate from dbt run/build commands. Running freshness tests more often can help prevent stale data during production runs. Being aware that your sources are outdated earlier will provide you more time to correct the issue before materializing production models.</p><h1>Assertion tests</h1><p>Similarly to SQL models, you could add assertion data tests to the sources.</p><blockquote><p>&#9888;&#65039;&nbsp;Pay attention, since dbt 1.8 <em>tests</em> parameter was updated to <em>data_tests</em>. Old syntax will be deprecated with time. See explanations <a href="https://docs.getdbt.com/docs/build/data-tests#new-data_tests-syntax">here</a>.</p></blockquote><p>Start by adding generic tests to columns:</p><pre><code><code>sources:
  - name: stripe
    tables:
      - name: charges
&#9;
        columns:
&#9;  - name: id
&#9;    data_tests:
&#9;      - not_null
&#9;      - unique</code></code></pre><p>Or you could add singular tests by putting .sql file to <em>/tests</em> folder:</p><pre><code><code>select *
from  {{ source('stripe', 'charges') }}
where amount &lt; 0</code></code></pre><p>To run tests on sources use the following syntax:</p><pre><code><code>dbt test --select "source:*"

# or
dbt test --select "source:stripe"

# or
dbt test --select "source:stripe.charges"</code></code></pre><p>If you are utilizing modeling layers, particularly the <em>staging layer</em> for your sources, you can move all those tests from sources to staging models. This is only feasible if your staging models are one-to-one representation of your sources. Another advantage of testing staging models is that if you use the dbt build command instead of dbt run, failed tests on staging models will prevent issues from propagating to downstream models.</p><h2>What tests should I perform on the sources?</h2><p>While this is a very open-ended question, I typically pick something from a set of &#8220;golden tests&#8221; that should ensure the correctness of my data sources.</p><p>Here you can find a few recommendations:</p><ul><li><p>Check for <strong>expected columns</strong> (e.g. lighter version of "data contracts"). For instance, try using the <a href="https://github.com/calogica/dbt-expectations/tree/0.10.3/?tab=readme-ov-file#expect_table_columns_to_contain_set">expect_table_columns_to_contain_set</a> test from the dbt_expectations package.</p></li><li><p>Check for <strong>duplicates</strong>. If the source has a primary key, this task is straightforward. If not, create a <a href="https://github.com/dbt-labs/dbt-utils?tab=readme-ov-file#generate_surrogate_key-source">surrogate key</a> and test it for uniqueness and non-null values.</p></li><li><p>Check for <strong>completeness</strong>. This somewhat complex test should alert you about missing dates or particular column values (e.g., missing partition). I typically create custom SQL tests for such cases, but there may be a package available for this purpose.</p></li><li><p>Check for <strong>relationships</strong>. A standard <a href="https://docs.getdbt.com/reference/resource-properties/data-tests#relationships">relationships</a> data test should be useful for this purpose. I use it to check sources with the same identifiers, e.g., all <em>user_id</em>'s from the <em>orders</em> table must match those in <em>users</em> table.</p></li><li><p>Check for <strong>volume anomalies</strong>. This is particularly useful when the data is recent but contains a significantly lower or higher number of rows. Consider using the <a href="https://docs.elementary-data.com/data-tests/anomaly-detection-tests/volume-anomalies">volume_anomalies</a> test from the elementary package.</p></li></ul><div><hr></div><p><em><strong>If you liked this issue please subscribe and share it with your colleagues, this greatly helps me developing this newsletter!</strong></em></p><p>See you next time &#128075;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to #dbtips!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Native unit-testing in dbt]]></title><description><![CDATA[A primer on how to implement unit tests in dbt]]></description><link>https://dbtips.substack.com/p/native-unit-testing-in-dbt</link><guid isPermaLink="false">https://dbtips.substack.com/p/native-unit-testing-in-dbt</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Tue, 23 Apr 2024 03:27:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!IqhY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8188aeaa-44c5-47af-89b4-cf27601776b0_2560x1440.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!IqhY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8188aeaa-44c5-47af-89b4-cf27601776b0_2560x1440.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!IqhY!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8188aeaa-44c5-47af-89b4-cf27601776b0_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!IqhY!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8188aeaa-44c5-47af-89b4-cf27601776b0_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!IqhY!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8188aeaa-44c5-47af-89b4-cf27601776b0_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!IqhY!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8188aeaa-44c5-47af-89b4-cf27601776b0_2560x1440.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!IqhY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8188aeaa-44c5-47af-89b4-cf27601776b0_2560x1440.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8188aeaa-44c5-47af-89b4-cf27601776b0_2560x1440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:143322,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!IqhY!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8188aeaa-44c5-47af-89b4-cf27601776b0_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!IqhY!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8188aeaa-44c5-47af-89b4-cf27601776b0_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!IqhY!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8188aeaa-44c5-47af-89b4-cf27601776b0_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!IqhY!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8188aeaa-44c5-47af-89b4-cf27601776b0_2560x1440.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The release of dbt v1.8 will introduce native <a href="https://docs.getdbt.com/docs/build/unit-tests">unit-testing capabilities</a>. This exciting new feature, long-awaited by many, is significant for several reasons. In this post I&#8217;ll explore why this feature is important, how it differs from existing dbt tests, and how you can apply it to your existing project.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>What is unit testing?</h1><p>In software engineering, <strong>unit testing</strong> is a process in which you test the smallest parts of your code. Typically, these are functional units such as functions or methods within a class. This involves providing some input values and observing the output to figuring out if the code works as expected. For any given input, there should be an expected output - this is the essence of unit testing.</p><p>Applying this concept to dbt, the smallest functional unit would be a model. Similar to functions, a model takes one or more inputs (other models) and produces an output (the resulting dataset).</p><p>In accordance with unit testing principles, you could simulate an input and expect an output for any given dbt model.</p><p>This approach differs from the classic dbt tests approach for two reasons:</p><ol><li><p>Existing dbt tests are too generic and lack knowledge of the underlying logic.</p></li><li><p>It's necessary to build the model before testing it.</p></li></ol><h2>Testing logic &#129300;</h2><p>In SQL, you might encounter numerous logical transformations, such as applying column functions, window functions, complex CASE statements, and string manipulations. Such logic is challenging to test with generic tests due to the lack of context for the transformation. However, in unit testing, you know the input, allowing you to anticipate a specific output. This makes testing such logic more viable.</p><p>Think about how often you had to modify the logic of a model because a real test case revealed that the existing logic was flawed. Reported bugs and edge cases serve as excellent input sources for unit testing. By using these, you can strengthen your models against future changes and prevent the repetition of past errors.</p><p>Unit testing is especially useful during refactoring. When refactoring affects a large number of models, it's challenging to ensure that the existing logic remains intact and no new bugs are introduced. If you have unit tests in place, you can confidently maintain the expected functionality without breaking production models.</p><h2>Testing without building &#128119;</h2><p>Another great benefit of unit testing is a testing using mock data and without building models with production data.</p><p>Using mock data in unit testing can provide faster results, as it eliminates the need to process your entire dataset. This approach allows you accelerate development cycle and simplify troubleshooting, as you don't have to wait for large amounts of data to be processed and transformed. This not only saves time but also resources, making your data warehouse bill much lower.</p><p>Finally, mock data provides a better understanding of what the output results should look like. This is because you can model the expected behavior even in an Excel spreadsheet.</p><h1>Unit testing in dbt 1.8</h1><blockquote><p>&#9888;&#65039; By the time of writing this article, unit testing is still in beta. Yet, you still could try this functionality to test-drive it. In the &#8220;Demo&#8221; section I&#8217;ll show you how to do that.</p></blockquote><p>To implement unit testing in dbt, you need to take a few steps. Firstly, configure the unit test itself. Secondly, create mock data, which will serve as the input for your models and additionally the expected output. To simplify this process, the developers of dbt have combined these steps.</p><p>To define a unit test in dbt, create a config file in YAML format. This is similar to how you would document your models or define data sources. Within the <em>/models</em> folder, create a file named <em>unit_testing.yaml</em> (the name is arbitrary, you can use something else).</p><p>Inside of the file let&#8217;s define our unit test:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!fAAM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9581bd0-1a7c-412b-9b27-03decd8930f0_1596x1052.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!fAAM!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9581bd0-1a7c-412b-9b27-03decd8930f0_1596x1052.png 424w, /__u/substackcdn.com/image/fetch/$s_!fAAM!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9581bd0-1a7c-412b-9b27-03decd8930f0_1596x1052.png 848w, /__u/substackcdn.com/image/fetch/$s_!fAAM!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9581bd0-1a7c-412b-9b27-03decd8930f0_1596x1052.png 1272w, /__u/substackcdn.com/image/fetch/$s_!fAAM!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9581bd0-1a7c-412b-9b27-03decd8930f0_1596x1052.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!fAAM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9581bd0-1a7c-412b-9b27-03decd8930f0_1596x1052.png" width="1456" height="960" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d9581bd0-1a7c-412b-9b27-03decd8930f0_1596x1052.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:960,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:175884,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!fAAM!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9581bd0-1a7c-412b-9b27-03decd8930f0_1596x1052.png 424w, /__u/substackcdn.com/image/fetch/$s_!fAAM!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9581bd0-1a7c-412b-9b27-03decd8930f0_1596x1052.png 848w, /__u/substackcdn.com/image/fetch/$s_!fAAM!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9581bd0-1a7c-412b-9b27-03decd8930f0_1596x1052.png 1272w, /__u/substackcdn.com/image/fetch/$s_!fAAM!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9581bd0-1a7c-412b-9b27-03decd8930f0_1596x1052.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You need to define a <a href="https://docs.getdbt.com/reference/resource-properties/unit-tests">few components</a> here:</p><ul><li><p>The name and description of the unit test</p></li><li><p>The referencing model</p></li><li><p>The input (mock) data inside the &#8220;<em>given&#8221;</em> parameter</p></li><li><p>The expected output in the &#8220;<em>expect&#8221;</em> parameter</p></li></ul><p>In the example above, mock data is defined as JSON rows, but it also can be defined as CSV rows like this:</p><pre><code><code>- input: ref('stg__users')
  format: csv
  rows: |
    user_id,email
    1,john@gmail.com
    2,mary@gmail.com</code></code></pre><p>You have several options to run the test(s):</p><pre><code><code>#&nbsp;run all tests on dim_users model, including unit tests:
dbt test -s dim_users


# run only unit tests:
dbt test -s "dim_users,test_type:unit"

# run a test by its name:
dbt test -s unit_testing__dim_users</code></code></pre><p>Remember, if the model you're testing relies on another model (which is likely in 99% of cases), you need to materialize the parent model first. However, there's a workaround to bypass full materialization step. You can create empty tables for upstream models like this:</p><pre><code><code>dbt run -s "stg__users stg__orders" --empty</code></code></pre><h1>Demo</h1><p>To demonstrate how unit testing works in real life I&#8217;ve prepared a simplest demo example. Similarly to the example above, it shows a pipeline of building <em>dim_users</em> model out of <em>users</em> and <em>orders</em> tables:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!esJX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae533d16-9837-4f70-971d-5c15d6c1369e_1171x409.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!esJX!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae533d16-9837-4f70-971d-5c15d6c1369e_1171x409.png 424w, /__u/substackcdn.com/image/fetch/$s_!esJX!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae533d16-9837-4f70-971d-5c15d6c1369e_1171x409.png 848w, /__u/substackcdn.com/image/fetch/$s_!esJX!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae533d16-9837-4f70-971d-5c15d6c1369e_1171x409.png 1272w, /__u/substackcdn.com/image/fetch/$s_!esJX!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae533d16-9837-4f70-971d-5c15d6c1369e_1171x409.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!esJX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae533d16-9837-4f70-971d-5c15d6c1369e_1171x409.png" width="1171" height="409" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae533d16-9837-4f70-971d-5c15d6c1369e_1171x409.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:409,&quot;width&quot;:1171,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49541,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!esJX!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae533d16-9837-4f70-971d-5c15d6c1369e_1171x409.png 424w, /__u/substackcdn.com/image/fetch/$s_!esJX!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae533d16-9837-4f70-971d-5c15d6c1369e_1171x409.png 848w, /__u/substackcdn.com/image/fetch/$s_!esJX!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae533d16-9837-4f70-971d-5c15d6c1369e_1171x409.png 1272w, /__u/substackcdn.com/image/fetch/$s_!esJX!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae533d16-9837-4f70-971d-5c15d6c1369e_1171x409.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can find the project <a href="https://github.com/oleg-agapov/dbt-unit-testing-demo">in this repo</a>. You can try it in Github Codespaces, see the instructions in the README.</p><p>Next, in file <em><a href="https://github.com/oleg-agapov/dbt-unit-testing-demo/blob/main/dbt_unit_testing/models/_unit_tests.yml">_unit_tests.yml</a></em> you can find a configuration of the test. It&#8217;s pretty much the same as in the example above.</p><p>To run the test, you can try <em>dbt test</em>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!0X4R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe57fea24-a732-49b0-8f36-8e390a12c8e1_819x264.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!0X4R!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe57fea24-a732-49b0-8f36-8e390a12c8e1_819x264.png 424w, /__u/substackcdn.com/image/fetch/$s_!0X4R!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe57fea24-a732-49b0-8f36-8e390a12c8e1_819x264.png 848w, /__u/substackcdn.com/image/fetch/$s_!0X4R!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe57fea24-a732-49b0-8f36-8e390a12c8e1_819x264.png 1272w, /__u/substackcdn.com/image/fetch/$s_!0X4R!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe57fea24-a732-49b0-8f36-8e390a12c8e1_819x264.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!0X4R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe57fea24-a732-49b0-8f36-8e390a12c8e1_819x264.png" width="819" height="264" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e57fea24-a732-49b0-8f36-8e390a12c8e1_819x264.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:264,&quot;width&quot;:819,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53682,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!0X4R!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe57fea24-a732-49b0-8f36-8e390a12c8e1_819x264.png 424w, /__u/substackcdn.com/image/fetch/$s_!0X4R!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe57fea24-a732-49b0-8f36-8e390a12c8e1_819x264.png 848w, /__u/substackcdn.com/image/fetch/$s_!0X4R!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe57fea24-a732-49b0-8f36-8e390a12c8e1_819x264.png 1272w, /__u/substackcdn.com/image/fetch/$s_!0X4R!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe57fea24-a732-49b0-8f36-8e390a12c8e1_819x264.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As you can see, the test was successful since the output matched the expected result. To simulate a failed test, you could modify the <em>dim_users</em> model. For example, change the LEFT JOIN to an INNER JOIN. After re-running the test, you're likely to notice a difference:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!qu5I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2135ba4-0680-46c3-97bb-02e9ac68b5cc_816x422.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!qu5I!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2135ba4-0680-46c3-97bb-02e9ac68b5cc_816x422.png 424w, /__u/substackcdn.com/image/fetch/$s_!qu5I!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2135ba4-0680-46c3-97bb-02e9ac68b5cc_816x422.png 848w, /__u/substackcdn.com/image/fetch/$s_!qu5I!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2135ba4-0680-46c3-97bb-02e9ac68b5cc_816x422.png 1272w, /__u/substackcdn.com/image/fetch/$s_!qu5I!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2135ba4-0680-46c3-97bb-02e9ac68b5cc_816x422.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!qu5I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2135ba4-0680-46c3-97bb-02e9ac68b5cc_816x422.png" width="816" height="422" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c2135ba4-0680-46c3-97bb-02e9ac68b5cc_816x422.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:422,&quot;width&quot;:816,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:77273,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!qu5I!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2135ba4-0680-46c3-97bb-02e9ac68b5cc_816x422.png 424w, /__u/substackcdn.com/image/fetch/$s_!qu5I!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2135ba4-0680-46c3-97bb-02e9ac68b5cc_816x422.png 848w, /__u/substackcdn.com/image/fetch/$s_!qu5I!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2135ba4-0680-46c3-97bb-02e9ac68b5cc_816x422.png 1272w, /__u/substackcdn.com/image/fetch/$s_!qu5I!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2135ba4-0680-46c3-97bb-02e9ac68b5cc_816x422.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The output indicates that the actual result does not match the expected one, and it even highlights the problematic rows. This is unit testing in action!</p><div><hr></div><p><em><strong>If you liked this issue please subscribe and share it with your colleagues, this greatly helps me developing this newsletter!</strong></em></p><p>See you next time &#128075;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to #dbtips!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[dbtips digest #2]]></title><description><![CDATA[dbt Explorer, macros docs, testing business logic]]></description><link>https://dbtips.substack.com/p/dbtips-digest-2</link><guid isPermaLink="false">https://dbtips.substack.com/p/dbtips-digest-2</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Tue, 20 Feb 2024 01:49:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5vfh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b96863-3a36-4d70-8987-49bb1645f225_2560x1440.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!5vfh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b96863-3a36-4d70-8987-49bb1645f225_2560x1440.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!5vfh!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b96863-3a36-4d70-8987-49bb1645f225_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!5vfh!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b96863-3a36-4d70-8987-49bb1645f225_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!5vfh!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b96863-3a36-4d70-8987-49bb1645f225_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!5vfh!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b96863-3a36-4d70-8987-49bb1645f225_2560x1440.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!5vfh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b96863-3a36-4d70-8987-49bb1645f225_2560x1440.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/79b96863-3a36-4d70-8987-49bb1645f225_2560x1440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4638491,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!5vfh!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b96863-3a36-4d70-8987-49bb1645f225_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!5vfh!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b96863-3a36-4d70-8987-49bb1645f225_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!5vfh!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b96863-3a36-4d70-8987-49bb1645f225_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!5vfh!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79b96863-3a36-4d70-8987-49bb1645f225_2560x1440.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This year is going to be full of exciting new releases for dbt. As <a href="https://github.com/dbt-labs/dbt-core/blob/main/docs/roadmap/2023-11-dbt-tng.md">promised by dbt Labs</a> in November of last year, their current focus is on ensuring the stability of dbt-core. Additionally, one of the most highly anticipated features is the native unit testing, which is expected to be introduced in version 1.8 this spring. Exciting!</p><p>Meanwhile, the developers of dbt Cloud continue to release new features for their commercial product. Today, we will discuss some of the improvements they have made to dbt Explorer, which replaces dbt docs in dbt Cloud. These new features add significant value to the platform!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>New features in dbt Explorer</h1><p>dbt Explorer is the successor of dbt docs for dbt Cloud users.</p><p>dbt Explorer is slick and modern. It has revamped UI, supports cross project lineage (in case you are using dbt Mesh), and gives you old good models documentation and lineage graph. And it just got a little bit better!</p><p>Meet three new features of dbt Explorer:</p><ul><li><p>Column level lineage &#129321;</p></li><li><p>Project recommendations &#9997;&#65039;</p></li><li><p>Performance assessment &#128640;</p></li></ul><h2>Column-level lineage</h2><p>Yes, column-level lineage is now included in dbt!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Swrh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c750694-46b1-4744-bb0e-3e6ae2364949_2058x964.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Swrh!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c750694-46b1-4744-bb0e-3e6ae2364949_2058x964.png 424w, /__u/substackcdn.com/image/fetch/$s_!Swrh!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c750694-46b1-4744-bb0e-3e6ae2364949_2058x964.png 848w, /__u/substackcdn.com/image/fetch/$s_!Swrh!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c750694-46b1-4744-bb0e-3e6ae2364949_2058x964.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Swrh!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c750694-46b1-4744-bb0e-3e6ae2364949_2058x964.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Swrh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c750694-46b1-4744-bb0e-3e6ae2364949_2058x964.png" width="1456" height="682" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c750694-46b1-4744-bb0e-3e6ae2364949_2058x964.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:682,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:163042,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Swrh!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c750694-46b1-4744-bb0e-3e6ae2364949_2058x964.png 424w, /__u/substackcdn.com/image/fetch/$s_!Swrh!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c750694-46b1-4744-bb0e-3e6ae2364949_2058x964.png 848w, /__u/substackcdn.com/image/fetch/$s_!Swrh!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c750694-46b1-4744-bb0e-3e6ae2364949_2058x964.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Swrh!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c750694-46b1-4744-bb0e-3e6ae2364949_2058x964.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Screenshot from dbt blog</figcaption></figure></div><p>However, there are some limitations. First, it will only be available in dbt Explorer and there will be no updates for older dbt docs. Second, currently it is only available for users on the Enterprise plan, so those on the Team plan will not have access to it.</p><p>Nevertheless, this is great news and shows that this feature is not forgotten. Hopefully, one day we will have widespread accessibility for dbt-core as well.</p><p>On a side note, <a href="https://twitter.com/Captaintobs">Toby Mao,</a> one of the creators of <a href="https://sqlmesh.com/">SQLmesh</a> (dbt alternative) mentioned that they support column-level lineage in their UI as well as they have support for parsing existing dbt projects. So definitely try them out if you want to have CLL for your models.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!2jkP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6908489-35b9-47ce-8068-59b8446dc4e5_1832x856.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!2jkP!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6908489-35b9-47ce-8068-59b8446dc4e5_1832x856.png 424w, /__u/substackcdn.com/image/fetch/$s_!2jkP!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6908489-35b9-47ce-8068-59b8446dc4e5_1832x856.png 848w, /__u/substackcdn.com/image/fetch/$s_!2jkP!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6908489-35b9-47ce-8068-59b8446dc4e5_1832x856.png 1272w, /__u/substackcdn.com/image/fetch/$s_!2jkP!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6908489-35b9-47ce-8068-59b8446dc4e5_1832x856.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!2jkP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6908489-35b9-47ce-8068-59b8446dc4e5_1832x856.png" width="1456" height="680" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6908489-35b9-47ce-8068-59b8446dc4e5_1832x856.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:680,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:365832,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!2jkP!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6908489-35b9-47ce-8068-59b8446dc4e5_1832x856.png 424w, /__u/substackcdn.com/image/fetch/$s_!2jkP!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6908489-35b9-47ce-8068-59b8446dc4e5_1832x856.png 848w, /__u/substackcdn.com/image/fetch/$s_!2jkP!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6908489-35b9-47ce-8068-59b8446dc4e5_1832x856.png 1272w, /__u/substackcdn.com/image/fetch/$s_!2jkP!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6908489-35b9-47ce-8068-59b8446dc4e5_1832x856.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>(<a href="https://twitter.com/captaintobs/status/1757601463852023876">source</a>)</p><h2>Recommendations</h2><p>Recommendations provide insights on your project and models. For example, the general overview tab displays documentation and test coverage. Additionally, each model in your project has a tab with specific recommendations.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!__a7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88d50fe9-dc07-4052-9c23-17c48e33aecf_2248x1220.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!__a7!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88d50fe9-dc07-4052-9c23-17c48e33aecf_2248x1220.png 424w, /__u/substackcdn.com/image/fetch/$s_!__a7!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88d50fe9-dc07-4052-9c23-17c48e33aecf_2248x1220.png 848w, /__u/substackcdn.com/image/fetch/$s_!__a7!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88d50fe9-dc07-4052-9c23-17c48e33aecf_2248x1220.png 1272w, /__u/substackcdn.com/image/fetch/$s_!__a7!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88d50fe9-dc07-4052-9c23-17c48e33aecf_2248x1220.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!__a7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88d50fe9-dc07-4052-9c23-17c48e33aecf_2248x1220.png" width="1456" height="790" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/88d50fe9-dc07-4052-9c23-17c48e33aecf_2248x1220.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:790,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:307469,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!__a7!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88d50fe9-dc07-4052-9c23-17c48e33aecf_2248x1220.png 424w, /__u/substackcdn.com/image/fetch/$s_!__a7!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88d50fe9-dc07-4052-9c23-17c48e33aecf_2248x1220.png 848w, /__u/substackcdn.com/image/fetch/$s_!__a7!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88d50fe9-dc07-4052-9c23-17c48e33aecf_2248x1220.png 1272w, /__u/substackcdn.com/image/fetch/$s_!__a7!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F88d50fe9-dc07-4052-9c23-17c48e33aecf_2248x1220.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Screenshot from dbt blog</figcaption></figure></div><p>All of that functionality is available in the open-source <a href="https://github.com/dbt-labs/dbt-project-evaluator">dbt-project-evaluator</a> package. It appears that dbt Cloud runs all of those checks in the background, so you don't need to install the package yourself. However, if you are not a dbt Cloud user and still want to check your project for best practices, I highly recommend using this package.</p><h2>Performance</h2><p>Finally, the performance feature allows you to monitor the run times of your models and provides an overview of the longest running models and the models with the most number of failures.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!aK39!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb064b301-6bb3-4315-be7e-ca7aab6f0a49_1978x1000.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!aK39!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb064b301-6bb3-4315-be7e-ca7aab6f0a49_1978x1000.png 424w, /__u/substackcdn.com/image/fetch/$s_!aK39!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb064b301-6bb3-4315-be7e-ca7aab6f0a49_1978x1000.png 848w, /__u/substackcdn.com/image/fetch/$s_!aK39!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb064b301-6bb3-4315-be7e-ca7aab6f0a49_1978x1000.png 1272w, /__u/substackcdn.com/image/fetch/$s_!aK39!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb064b301-6bb3-4315-be7e-ca7aab6f0a49_1978x1000.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!aK39!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb064b301-6bb3-4315-be7e-ca7aab6f0a49_1978x1000.png" width="1456" height="736" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b064b301-6bb3-4315-be7e-ca7aab6f0a49_1978x1000.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:736,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:116573,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!aK39!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb064b301-6bb3-4315-be7e-ca7aab6f0a49_1978x1000.png 424w, /__u/substackcdn.com/image/fetch/$s_!aK39!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb064b301-6bb3-4315-be7e-ca7aab6f0a49_1978x1000.png 848w, /__u/substackcdn.com/image/fetch/$s_!aK39!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb064b301-6bb3-4315-be7e-ca7aab6f0a49_1978x1000.png 1272w, /__u/substackcdn.com/image/fetch/$s_!aK39!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb064b301-6bb3-4315-be7e-ca7aab6f0a49_1978x1000.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Screenshot from dbt blog</figcaption></figure></div><p>Another interesting aspect is that you can observe the trend of past runs for a specific model, which can give you an idea of the runtime's increase over time. This enables you to keep track of models that gradually increase your costs and optimize them accordingly.</p><p>If you want to implement it yourself, take a look at the <a href="https://www.elementary-data.com/">Elementary package.</a> Essentially, it provides very similar data that allows you to monitor your project.</p><p>More on all three features you can read from the official dbt <a href="https://docs.getdbt.com/blog/dbt-explorer">blog post</a>.</p><h1>Weekly (db)tips</h1><p>Now to some tips :)</p><p>Last week, I had a discussion with students of the "<a href="https://uplimit.com/course/advanced-dbt">Advanced dbt</a>" course (in which I serve as a teaching assistant). We covered two topics: macros documentation and testing business rules in dbt. Here is a brief summary of both discussions.</p><h2>Macros documentation</h2><p>Apparently, not many dbt-folks are aware that you can document your macros in the same way you document your models and data sources.</p><p>Create a YAML file in the /macros folder and add a description to the macro and its arguments:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!tfJP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c6f0b1-c206-4a27-b5e5-792426392711_1444x924.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!tfJP!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c6f0b1-c206-4a27-b5e5-792426392711_1444x924.png 424w, /__u/substackcdn.com/image/fetch/$s_!tfJP!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c6f0b1-c206-4a27-b5e5-792426392711_1444x924.png 848w, /__u/substackcdn.com/image/fetch/$s_!tfJP!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c6f0b1-c206-4a27-b5e5-792426392711_1444x924.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tfJP!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c6f0b1-c206-4a27-b5e5-792426392711_1444x924.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!tfJP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c6f0b1-c206-4a27-b5e5-792426392711_1444x924.png" width="1444" height="924" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93c6f0b1-c206-4a27-b5e5-792426392711_1444x924.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:924,&quot;width&quot;:1444,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:299860,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!tfJP!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c6f0b1-c206-4a27-b5e5-792426392711_1444x924.png 424w, /__u/substackcdn.com/image/fetch/$s_!tfJP!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c6f0b1-c206-4a27-b5e5-792426392711_1444x924.png 848w, /__u/substackcdn.com/image/fetch/$s_!tfJP!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c6f0b1-c206-4a27-b5e5-792426392711_1444x924.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tfJP!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93c6f0b1-c206-4a27-b5e5-792426392711_1444x924.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Having documented macros can bring the same benefits as documenting your models:</p><ul><li><p>clarity and understanding of the use case</p></li><li><p>easier to discover and reuse in new models</p></li><li><p>knowledge sharing with your team</p></li></ul><h2>Testing business rules</h2><p>In dbt, we typically write tests to check data quality. For example, we check for column emptiness, uniqueness, or perform other assertion tests.</p><p>However, there are times when it is also useful to test business rules and context.</p><p>For example, in your <em>dim_user_subscriptions</em> table, you have two calculated columns: <em>first_subscription_date</em> and <em>count_of_total_subscriptions</em>. From a business standpoint, it is impossible to have an empty <em>first_subscription_date</em> while <em>count_of_total_subscriptions</em> is greater than 0. This breaks the logic.</p><p>Your business may expect the subscriptions table to always contain information from all payment providers, or that the data should come from both IOS and ANDROID platforms. However, there may be delays or other issues with data delivery that can go unnoticed with simple assertion tests. To identify these errors, it is necessary to understand the business context and set up appropriate tests.</p><p>I typically use <a href="https://docs.getdbt.com/docs/build/data-tests">dbt singular tests</a> that can capture these tricky scenarios and alert the team before they reach the CEOs dashboard. In some cases, you could even <a href="https://docs.getdbt.com/best-practices/writing-custom-generic-tests">promote singular tests to generic</a>.</p><div><hr></div><p><em><strong>If you liked this issue please subscribe and share it with your colleagues, this greatly helps me developing this newsletter!</strong></em></p><p>See you next time &#128075;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to #dbtips!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[What the heck is dbt artifacts?]]></title><description><![CDATA[You'll know everything about them after reading this post]]></description><link>https://dbtips.substack.com/p/what-the-heck-is-dbt-artifacts</link><guid isPermaLink="false">https://dbtips.substack.com/p/what-the-heck-is-dbt-artifacts</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Mon, 29 Jan 2024 03:33:20 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!d758!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F006ce4e4-9a2a-430b-8f08-7f1feedbf211_1920x1005.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!d758!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F006ce4e4-9a2a-430b-8f08-7f1feedbf211_1920x1005.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!d758!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F006ce4e4-9a2a-430b-8f08-7f1feedbf211_1920x1005.png 424w, /__u/substackcdn.com/image/fetch/$s_!d758!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F006ce4e4-9a2a-430b-8f08-7f1feedbf211_1920x1005.png 848w, /__u/substackcdn.com/image/fetch/$s_!d758!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F006ce4e4-9a2a-430b-8f08-7f1feedbf211_1920x1005.png 1272w, /__u/substackcdn.com/image/fetch/$s_!d758!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F006ce4e4-9a2a-430b-8f08-7f1feedbf211_1920x1005.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!d758!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F006ce4e4-9a2a-430b-8f08-7f1feedbf211_1920x1005.png" width="728" height="381" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/006ce4e4-9a2a-430b-8f08-7f1feedbf211_1920x1005.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:762,&quot;width&quot;:1456,&quot;resizeWidth&quot;:728,&quot;bytes&quot;:2148977,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!d758!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F006ce4e4-9a2a-430b-8f08-7f1feedbf211_1920x1005.png 424w, /__u/substackcdn.com/image/fetch/$s_!d758!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F006ce4e4-9a2a-430b-8f08-7f1feedbf211_1920x1005.png 848w, /__u/substackcdn.com/image/fetch/$s_!d758!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F006ce4e4-9a2a-430b-8f08-7f1feedbf211_1920x1005.png 1272w, /__u/substackcdn.com/image/fetch/$s_!d758!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F006ce4e4-9a2a-430b-8f08-7f1feedbf211_1920x1005.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When you run dbt commands, they generate a significant amount of metadata. This includes storing compiled SQL code of your models without Jinja, compiled code of generic tests, and a DAG pipeline for dbt docs. These artifacts, collectively known as dbt artifacts, can be seen as byproducts of your dbt commands. Each time you run dbt commands, the artifacts are updated to reflect the latest state of your project.</p><p>There are various applications of dbt artifacts. One of the most popular example is some dbt packages. These packages rely on dbt artifacts to gather information about your project directly. Another example is data observability, as dbt artifacts provide insights into model runtimes, failed tests, and source freshness information stored conveniently.</p><h2>&#8220;dbt artifacts is a way to make analytics on your analytics&#8221;</h2><p>(thanks to Emily Hawking for this <a href="https://www.youtube.com/watch?v=kqyxHCHH0d4">cleverly expressed thought</a>)</p><p>In today's post, I will guide you through dbt artifacts that may inspire you to use them in your job, enhancing the efficiency and performance of your dbt project.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>What are dbt artifacts exactly?</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!pz70!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F465b96a5-fdce-4b38-91e7-ab70b29229a3_3072x1947.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!pz70!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F465b96a5-fdce-4b38-91e7-ab70b29229a3_3072x1947.png 424w, /__u/substackcdn.com/image/fetch/$s_!pz70!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F465b96a5-fdce-4b38-91e7-ab70b29229a3_3072x1947.png 848w, /__u/substackcdn.com/image/fetch/$s_!pz70!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F465b96a5-fdce-4b38-91e7-ab70b29229a3_3072x1947.png 1272w, /__u/substackcdn.com/image/fetch/$s_!pz70!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F465b96a5-fdce-4b38-91e7-ab70b29229a3_3072x1947.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!pz70!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F465b96a5-fdce-4b38-91e7-ab70b29229a3_3072x1947.png" width="1456" height="923" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/465b96a5-fdce-4b38-91e7-ab70b29229a3_3072x1947.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:923,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:7607535,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!pz70!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F465b96a5-fdce-4b38-91e7-ab70b29229a3_3072x1947.png 424w, /__u/substackcdn.com/image/fetch/$s_!pz70!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F465b96a5-fdce-4b38-91e7-ab70b29229a3_3072x1947.png 848w, /__u/substackcdn.com/image/fetch/$s_!pz70!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F465b96a5-fdce-4b38-91e7-ab70b29229a3_3072x1947.png 1272w, /__u/substackcdn.com/image/fetch/$s_!pz70!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F465b96a5-fdce-4b38-91e7-ab70b29229a3_3072x1947.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>dbt artifacts are JSON files that are stored in the <em>/target</em> directory whenever you run dbt commands. Each command produces different artifacts.</p><p>There are five types of artifacts:</p><ul><li><p><em><strong>manifest.json</strong></em> &#8211;&nbsp;a file that contains all info about your dbt project and its resources (models, tests, macros, etc). Each resource also contains information about configuration and properties.</p></li><li><p><em><strong>run_results.json</strong></em> &#8211;&nbsp;stores info about a completed dbt invocation, including models timing, test results, number of captured records by dbt snapshots, etc.</p></li><li><p><em><strong>catalog.json</strong></em> &#8211; created after running <em>dbt docs generate</em> and contains info from data warehouse about generated views and tables (number of rows, column types, etc).</p></li><li><p><em><strong>sources.json</strong></em> &#8211; produced by dbt source freshness command and contains info about sources and their freshness.</p></li><li><p><em><strong>semantic_manifest.json</strong></em> &#8211;&nbsp;stores a comprehensive information about <a href="https://docs.getdbt.com/docs/use-dbt-semantic-layer/dbt-sl">dbt Semantic Layer</a>.</p></li></ul><p>Let's quickly dive into each file to discover any interesting findings.</p><h2>manifest.json</h2><p>Manifest file is produced by almost every dbt command, excluding the ones that do not work with models, like <em>dbt debug</em>, <em>dbt init</em>, etc.</p><p>It represents your dbt project, including models, tests, data sources, macros, exposures, and more. It also includes the relationships between these items, which dbt uses to visualize the DAG (Directed Acyclic Graph).</p><p>Interestingly, even if you run only a subset of models (e.g. with --<em>select</em>), all resources will appear in the manifest. However, some properties, like <em>compiled_sql</em>, might be missing for models outside of the selected, since such properties only appear after compiling and executing models.</p><p>The manifest is used to render dbt docs and perform state comparison. Having a production manifest is necessary to perform selectors like <em>state:modified</em>.</p><p>Since it is a simple JSON file, you can open it with any editor and explore it on your own.</p><blockquote><p>Tip: By default, the file is formatted as a single line, which can make it difficult to read. Use this simple Python command to convert it to a properly formatted and indented view:<br><code><br>python3 -m json.tool manifest.json &gt; manifest_formatted.json <br></code></p></blockquote><p>The manifest has several top-level keys for each item type or configuration:</p><pre><code><code>{
    "metadata": {...},       # metadata dbt version, run date, etc
    "nodes": {...},          # list of models, seeds, snapshots, tests
    "sources": {...},        # list of data sources
    "macros": {...},         # info macros
    "docs": {...},           # doc strings from YAML files
    "exposures": {...},      # list of exposures
    "metrics": {...},        # dictionary of metrics
    "groups": {...},         # dict of groups
    "selectors": {...},      # user-defined selectors
    "disabled": {...},       # list of disabled models
    "parent_map": {...},     # list of first-order parents (for DAG)
    "child_map": {...},      # list of first-order child (for DAG)
    "group_map": {...},      # mapping of group names to nodes
    "semantic_models": {...} # dbt Semantic Models
}</code></code></pre><p>By utilizing <em>nodes</em>, <em>sources</em>, <em>exposures</em>, and <em>metrics</em>, you can obtain a comprehensive list of all the resources in the project. By using <em>parent_map</em> and <em>child_map</em>, you can construct a DAG from these resources. Additionally, the <em>docs</em> property allows you to identify which models and tests have documentation. The possibilities are endless!</p><p>The manifest is the most basic and commonly used artifact as it contains all the essential information about your dbt project.</p><h2>run_results.json</h2><p>The <em>run_results</em> stores the results of a dbt invocation. It only contains the result of the most recent run and does not store the history of all runs.</p><p>When you execute the dbt command, such as <em>dbt run</em>, this artifact will store all the information about that run. This includes the full invocation command (with flags and parameters), used selectors, as well as the results and statuses of each model, test, or other resource.</p><p>It contains four top-level keys:</p><pre><code><code>{
    "metadata": {...},       # dbt metadata
    "results": [...],        # results for each model in the run
    "elapsed_time": 12.34,   # elapsed time in seconds
    "args": {...}            # info about dbt command
}</code></code></pre><p>The array of <em>results</em> contains information about each model in the run, limited to the selector you used. It shows the used SQL, timing, name of the final table/view, and the status (success or error). The top-level <em>elapsed_time</em> parameter indicates the total time the command took to execute, from start to finish (in seconds).</p><p>By using run results, you can generate advanced analytics for your dbt project. For instance, consider the <a href="https://www.elementary-data.com/">elementary</a> dbt package. This package offers data observability capabilities, allowing you to extract statistics from run results artifacts, store them in your data warehouse, and create a comprehensive <a href="https://storage.googleapis.com/elementary_static/elementary_demo.html#/report/dashboard">observability dashboard</a>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!b2gX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e55ae-685f-4282-8791-e6b8b834d671_1255x859.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!b2gX!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e55ae-685f-4282-8791-e6b8b834d671_1255x859.png 424w, /__u/substackcdn.com/image/fetch/$s_!b2gX!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e55ae-685f-4282-8791-e6b8b834d671_1255x859.png 848w, /__u/substackcdn.com/image/fetch/$s_!b2gX!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e55ae-685f-4282-8791-e6b8b834d671_1255x859.png 1272w, /__u/substackcdn.com/image/fetch/$s_!b2gX!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e55ae-685f-4282-8791-e6b8b834d671_1255x859.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!b2gX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e55ae-685f-4282-8791-e6b8b834d671_1255x859.png" width="1255" height="859" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a8e55ae-685f-4282-8791-e6b8b834d671_1255x859.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:859,&quot;width&quot;:1255,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:97532,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!b2gX!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e55ae-685f-4282-8791-e6b8b834d671_1255x859.png 424w, /__u/substackcdn.com/image/fetch/$s_!b2gX!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e55ae-685f-4282-8791-e6b8b834d671_1255x859.png 848w, /__u/substackcdn.com/image/fetch/$s_!b2gX!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e55ae-685f-4282-8791-e6b8b834d671_1255x859.png 1272w, /__u/substackcdn.com/image/fetch/$s_!b2gX!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a8e55ae-685f-4282-8791-e6b8b834d671_1255x859.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>catalog.json</h2><p>The catalog artifact is generated by running the <em>dbt docs generate</em> command. This file provides information (from data warehouse) about the tables and views created from your dbt models. Essentially, it includes the name of each model in the database, details about the columns and their data types, as well as statistics like the number of rows, table size, and last modified date.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!LTw1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c8695ef-cd45-4c2e-8c87-760a3cfe10b8_1141x371.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!LTw1!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c8695ef-cd45-4c2e-8c87-760a3cfe10b8_1141x371.png 424w, /__u/substackcdn.com/image/fetch/$s_!LTw1!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c8695ef-cd45-4c2e-8c87-760a3cfe10b8_1141x371.png 848w, /__u/substackcdn.com/image/fetch/$s_!LTw1!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c8695ef-cd45-4c2e-8c87-760a3cfe10b8_1141x371.png 1272w, /__u/substackcdn.com/image/fetch/$s_!LTw1!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c8695ef-cd45-4c2e-8c87-760a3cfe10b8_1141x371.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!LTw1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c8695ef-cd45-4c2e-8c87-760a3cfe10b8_1141x371.png" width="1141" height="371" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c8695ef-cd45-4c2e-8c87-760a3cfe10b8_1141x371.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:371,&quot;width&quot;:1141,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:44700,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!LTw1!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c8695ef-cd45-4c2e-8c87-760a3cfe10b8_1141x371.png 424w, /__u/substackcdn.com/image/fetch/$s_!LTw1!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c8695ef-cd45-4c2e-8c87-760a3cfe10b8_1141x371.png 848w, /__u/substackcdn.com/image/fetch/$s_!LTw1!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c8695ef-cd45-4c2e-8c87-760a3cfe10b8_1141x371.png 1272w, /__u/substackcdn.com/image/fetch/$s_!LTw1!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c8695ef-cd45-4c2e-8c87-760a3cfe10b8_1141x371.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It has 4 top-level keys:</p><pre><code><code>{
    "metadata": {...},  # dbt metadata
    "nodes": {...},     # list of tables/views for models
    "sources": {...},   # list of tables/views for data sources
    "errors": null      # error for docs generate command
}</code></code></pre><p>This artifact can be helpful for checking the percentage of documentation coverage. Also, it allows you to compare the number of columns in the model YAML and in the database, and then verify the existence of documentation using <em>manifest.json</em>. These and many other checks are implemented in the package called <a href="https://hub.getdbt.com/dbt-labs/dbt_project_evaluator/latest/">dbt_project_evaluator</a>. (Let me know in the comments if you want t detailed tutorial on this package).</p><h2>sources.json</h2><p>The <em>sources</em> artifact displays the results of the <em>dbt source freshness</em> command. It records information about the freshness check for each data source with a defined check. This information includes the maximum available timestamp, query execution time, and the status of the check.</p><p>The file itself has a simple structure:</p><pre><code><code>{
    "metadata": {...},     # dbt metadata
    "results": [...],      # arrays of freshness checks
    "elapsed_time": 1.23   # total execution time
}</code></code></pre><p>For example, in dbt Cloud, the <a href="https://docs.getdbt.com/docs/deploy/source-freshness">source freshness dashboard</a> uses this artifact to display freshness statistics. However, you can build the same dashboard yourself by using the aforementioned elementary package to store the results of the check in the data warehouse.</p><h2>semantic_manifest.json</h2><p>This file is a special artifact used by <a href="https://docs.getdbt.com/docs/build/about-metricflow">MetricFlow</a> to build metrics for the <a href="https://docs.getdbt.com/docs/use-dbt-semantic-layer/dbt-sl">dbt Semantic Layer</a>. It contains descriptions of the models required to work with the semantic layer. With this file, MetricFlow can understand how to build your metrics, including which models to use and which tables to join.</p><p>A semantic manifest is generated every time your project is parsed. This happens when you invoke <em>dbt parse</em> or any of the <em>run,</em> <em>build</em> or <em>compile</em> commands. Please note that the semantic layer with MetricFlow was introduced in v1.6, so you may not have this file in earlier versions.</p><p>The file structure is quite simple, with only three top-level keys:</p><pre><code><code>{
&#9;"semantic_models": [],  # entities, dimensions and measures
&#9;"metrics": [],                   # metrics definitions
&#9;"project_configuration": {...}   # additional configs
}</code></code></pre><p>The use of this artifact outside of Semantic Layer or MetricFlow is somewhat limited. To my knowledge, I haven't come across any interesting applications of this artifact. There are some 3rd-party semantic layers, such as <a href="https://cube.dev/">Cube</a>, that have integrations with dbt (check out this <a href="https://cube.dev/blog/introducing-dbt-integration-with-cube">link</a>), but these layers do not rely on MetricFlow definitions. Instead, they use their own method to describe metrics. If you know of any cool usage of the semantic manifest artifact, please let me know in the comments!</p><h1>Final words</h1><p>dbt artifacts provide a powerful way to gain insights into your dbt project. Essentially, dbt artifacts are simple JSON files that store valuable information about your models, running times, documentation, and more. By leveraging external dbt packages, you can create a comprehensive view of your project to improve its performance and robustness.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Like what you read? Subscribe for new issues!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Analytics Engineering in 2024]]></title><description><![CDATA[Totally reliable predictions for the upcoming year]]></description><link>https://dbtips.substack.com/p/analytics-engineering-in-2024</link><guid isPermaLink="false">https://dbtips.substack.com/p/analytics-engineering-in-2024</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Fri, 29 Dec 2023 20:22:19 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3c17fa5d-3f0b-4475-8e7a-38c6b8c5e4fa_1600x1005.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!KH28!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b222d7a-d6df-481c-ac1f-df5bc3d84b05_1920x1005.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!KH28!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b222d7a-d6df-481c-ac1f-df5bc3d84b05_1920x1005.png 424w, /__u/substackcdn.com/image/fetch/$s_!KH28!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b222d7a-d6df-481c-ac1f-df5bc3d84b05_1920x1005.png 848w, /__u/substackcdn.com/image/fetch/$s_!KH28!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b222d7a-d6df-481c-ac1f-df5bc3d84b05_1920x1005.png 1272w, /__u/substackcdn.com/image/fetch/$s_!KH28!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b222d7a-d6df-481c-ac1f-df5bc3d84b05_1920x1005.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!KH28!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b222d7a-d6df-481c-ac1f-df5bc3d84b05_1920x1005.png" width="1200" height="628.021978021978" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8b222d7a-d6df-481c-ac1f-df5bc3d84b05_1920x1005.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:762,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:2123881,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!KH28!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b222d7a-d6df-481c-ac1f-df5bc3d84b05_1920x1005.png 424w, /__u/substackcdn.com/image/fetch/$s_!KH28!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b222d7a-d6df-481c-ac1f-df5bc3d84b05_1920x1005.png 848w, /__u/substackcdn.com/image/fetch/$s_!KH28!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b222d7a-d6df-481c-ac1f-df5bc3d84b05_1920x1005.png 1272w, /__u/substackcdn.com/image/fetch/$s_!KH28!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8b222d7a-d6df-481c-ac1f-df5bc3d84b05_1920x1005.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>2023 was an exciting year for the dbt and Analytics Engineering field. There were a lot of changes: different <a href="https://www.getdbt.com/blog/consumption-based-pricing-and-the-future-of-dbt-cloud">pricing for dbt Cloud</a>, the <a href="https://www.getdbt.com/blog/dbt-acquisition-transform">acquisition</a> of Transform, <a href="https://github.com/dbt-labs/dbt-core/releases/tag/v1.4.0">several</a> <a href="https://github.com/dbt-labs/dbt-core/releases/tag/v1.5.0">dbt</a> <a href="https://github.com/dbt-labs/dbt-core/releases/tag/v1.6.0">version</a> <a href="https://github.com/dbt-labs/dbt-core/releases/tag/v1.7.0">upgrades</a>, and various changes to the product itself. On top of that, the data industry and AI had a pretty fruitful year. We&#8217;ve seen a dawn of ChatGPT and LLMs, AI-based start-ups and numerous applications that really changed IT industry.</p><p>Considering all these developments, let's explore together and try to predict where Analytics Engineering is headed in 2024.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>&#129302;&nbsp;Tight(er) integration with AI</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!WTyM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f4e88-805b-42ff-ae18-5e197222c077_1024x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!WTyM!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f4e88-805b-42ff-ae18-5e197222c077_1024x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!WTyM!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f4e88-805b-42ff-ae18-5e197222c077_1024x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!WTyM!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f4e88-805b-42ff-ae18-5e197222c077_1024x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WTyM!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f4e88-805b-42ff-ae18-5e197222c077_1024x768.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!WTyM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f4e88-805b-42ff-ae18-5e197222c077_1024x768.png" width="1024" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/415f4e88-805b-42ff-ae18-5e197222c077_1024x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1911719,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!WTyM!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f4e88-805b-42ff-ae18-5e197222c077_1024x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!WTyM!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f4e88-805b-42ff-ae18-5e197222c077_1024x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!WTyM!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f4e88-805b-42ff-ae18-5e197222c077_1024x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WTyM!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F415f4e88-805b-42ff-ae18-5e197222c077_1024x768.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Ride the AI wave...</figcaption></figure></div><p>There is no doubt that AI and LLMs were a major focal point in 2023. Not using ChatGPT in your daily work is akin to digging a hole with a shovel when you have an excavator in your garage. And we&#8217;ve seen a lot of applications across all technological fields, including data engineering and analytics in general.</p><p>At some point, people started applying LLMs to dbt. As example, <a href="https://pypi.org/project/dbt-ai/">this package</a> can read your dbt project and give suggestions for improvements. Well, I doubt that the quality of suggestions were matched to a qualified analytics engineer, but at least this was a start.</p><p>More promising application was <a href="https://www.reddit.com/r/dataengineering/comments/15nohkj/free_vs_code_extension_for_writing_dbt/">writing dbt documentation</a>. This task is more straightforward to describe and the quality of output is much better. <a href="https://www.turntable.so/docs-composer">This extension</a> allows you to write dbt documentation with AI and gives you a column-level lineage. Now we are talking!</p><p>And finally, the most promising application, in my opinion, is smart chat-bots for analytics. Yes, we&#8217;ve seen a rise of text-to-SQL bots that could translate human request to SQL and return a resulted dataset. But most of them lacked one thing &#8212; deep understanding of the business and underlying processes. And that what separated &#8220;dumb&#8221; chat-SQL bots from human data analysts. But hear me out, there is a better and smarter way.</p><p>Jason Ganz and some other folks from from dbt Labs <a href="https://roundup.getdbt.com/p/semantic-layer-as-the-data-interface">explained</a> how they managed to increase the quality of answers of text-to-SQL bot by giving it Semantic Layer as an input (instead of raw data description). They&#8217;ve seen a mind-blowing 83% increase of accuracy rate!</p><p>So, yeah, AI is powerful and it can be applicable to dbt and Analytics Engineering. I hope that in 2024 we will see some quality tools that will help us to use LLMs more effectively and conveniently&#129310;.</p><h1>&#127970;&nbsp;dbt for Enterprise</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!avwM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a61e501-01e8-4d2d-ab95-11090d9dafca_1024x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!avwM!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a61e501-01e8-4d2d-ab95-11090d9dafca_1024x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!avwM!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a61e501-01e8-4d2d-ab95-11090d9dafca_1024x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!avwM!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a61e501-01e8-4d2d-ab95-11090d9dafca_1024x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!avwM!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a61e501-01e8-4d2d-ab95-11090d9dafca_1024x768.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!avwM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a61e501-01e8-4d2d-ab95-11090d9dafca_1024x768.png" width="1024" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a61e501-01e8-4d2d-ab95-11090d9dafca_1024x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1750884,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!avwM!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a61e501-01e8-4d2d-ab95-11090d9dafca_1024x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!avwM!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a61e501-01e8-4d2d-ab95-11090d9dafca_1024x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!avwM!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a61e501-01e8-4d2d-ab95-11090d9dafca_1024x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!avwM!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a61e501-01e8-4d2d-ab95-11090d9dafca_1024x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>dbt is a business, and like any business, it needs to earn money. In the software industry, particularly for dbt, big companies or enterprises present the greatest opportunity for revenue generation. And no surprises dbt Labs is rolling out a lot of features for them.</p><p>One of the key ideas that was visible throughout Coalesce 2023 was about simplifying scaling of dbt in organizations. Just watch this <a href="https://www.youtube.com/watch?v=lNZLcsHAdco">keynote video</a> and count how many time they mentioned word &#8220;organization&#8221;.</p><p>Notable solutions include:</p><ul><li><p><a href="https://www.getdbt.com/product/dbt-explorer">dbt Explorer</a> feature that will come in place of dbt docs to give more convenient experience for Enterprises (will it even be available for dbt-core users? Dunno &#129335;&#8205;&#9794;&#65039;)</p></li><li><p><a href="https://www.getdbt.com/product/dbt-mesh">dbt mesh</a> &#8212; a set of solutions that will allow companies build <a href="https://www.datamesh-architecture.com/">Data Mesh architecture</a>. dbt developers steadily converged to this point by implementing various features, such as cross-project refs (since v1.6) or data contracts (since v1.5). Finally, big customers will be able to try out this new architecture without switching the tooling.</p></li><li><p>Finally, dbt Cloud now natively <a href="https://www.getdbt.com/blog/dbt-cloud-is-now-available-for-microsoft-fabric">supports Microsoft Fabric</a> and recently got a <a href="https://github.com/microsoft/dbt-fabric">native adapter</a> for Synapse DWH. Microsoft Fabric by itself is very interesting set of technologies and solutions for building data platforms that follows <a href="https://www.ibm.com/topics/data-fabric">Data Fabric</a> architecture (like, Data Mesh wasn&#8217;t enough). And many big companies who are strategically with Microsoft, are going to use Fabric, so dbt wants to be on this market.</p></li></ul><p>What all this means for analytics engineers?</p><p>I think that with time we will see dbt Mesh and some other features as requirements in job descriptions once big teams adopt these features. For us means that we need to learn these technologies, even if we don&#8217;t plan to use them on current projects. This is gonna be the way to stay competitive on the job market.</p><h1>&#128230;&nbsp;Further development of ecosystem</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!6Ojs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4551d-0a25-4eba-9633-2166e2ae2f77_1024x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!6Ojs!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4551d-0a25-4eba-9633-2166e2ae2f77_1024x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!6Ojs!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4551d-0a25-4eba-9633-2166e2ae2f77_1024x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!6Ojs!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4551d-0a25-4eba-9633-2166e2ae2f77_1024x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6Ojs!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4551d-0a25-4eba-9633-2166e2ae2f77_1024x768.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!6Ojs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4551d-0a25-4eba-9633-2166e2ae2f77_1024x768.png" width="1024" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fbe4551d-0a25-4eba-9633-2166e2ae2f77_1024x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1923089,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!6Ojs!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4551d-0a25-4eba-9633-2166e2ae2f77_1024x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!6Ojs!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4551d-0a25-4eba-9633-2166e2ae2f77_1024x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!6Ojs!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4551d-0a25-4eba-9633-2166e2ae2f77_1024x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!6Ojs!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffbe4551d-0a25-4eba-9633-2166e2ae2f77_1024x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One of the things I love about dbt is the availability of numerous external packages and how easy it is to integrate them into your project. Many dbt packages require minimal initial configuration and provide significant value to dbt projects.</p><p>My point here is extremely simple &#8212; don't be afraid to use external tools to enhance your pipeline. Without them, I would have to implement a lot of features myself, and I'm probably not the best coder. Here is a few examples.</p><p>Using <a href="https://www.elementary-data.com/">Elementary</a> it was very easy to implement data observability and alerting.</p><p>Ever needed dataset comparisons, e.g. old version of the table on Prod vs new version on Dev? Try Datafold&#8217;s <a href="https://github.com/datafold/data-diff">data-diff</a> tool.</p><p>Wanna diff reports for Pull Requests? Try <a href="https://github.com/infuseai/piperider">Piperider</a>.</p><p>Wanna know how much credits your dbt model cost in Snowflake? Try <a href="https://github.com/get-select/dbt-snowflake-monitoring">dbt-snowflake-monitoring</a> from SELECT.</p><p>I can probably go on and on, but I guess you get the point.</p><p>Of course, the core functionality of dbt will continue to evolve. Just recall how in v1.7 they integrated the <em>date-spine</em> macro into the core codebase. This suggests that some features will eventually become part of the core framework. However, as an analytics engineer, your job is to deliver those features today. This is where external packages can help you.</p><p>For the next year I expect to see even more new tools and ways to enhance dbt projects and make data models even better. Better testing, better alerting, better lineage (easy column-level lineage, please!) and who knows what else. Stay in touch!</p><h1>&#128184;&nbsp;Better cost containments</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!WUIV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8c0e2c-d5f6-4080-bebd-5a3f9e1fbb56_1024x764.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!WUIV!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8c0e2c-d5f6-4080-bebd-5a3f9e1fbb56_1024x764.png 424w, /__u/substackcdn.com/image/fetch/$s_!WUIV!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8c0e2c-d5f6-4080-bebd-5a3f9e1fbb56_1024x764.png 848w, /__u/substackcdn.com/image/fetch/$s_!WUIV!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8c0e2c-d5f6-4080-bebd-5a3f9e1fbb56_1024x764.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WUIV!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8c0e2c-d5f6-4080-bebd-5a3f9e1fbb56_1024x764.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!WUIV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8c0e2c-d5f6-4080-bebd-5a3f9e1fbb56_1024x764.png" width="1024" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/df8c0e2c-d5f6-4080-bebd-5a3f9e1fbb56_1024x764.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1606262,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!WUIV!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8c0e2c-d5f6-4080-bebd-5a3f9e1fbb56_1024x764.png 424w, /__u/substackcdn.com/image/fetch/$s_!WUIV!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8c0e2c-d5f6-4080-bebd-5a3f9e1fbb56_1024x764.png 848w, /__u/substackcdn.com/image/fetch/$s_!WUIV!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8c0e2c-d5f6-4080-bebd-5a3f9e1fbb56_1024x764.png 1272w, /__u/substackcdn.com/image/fetch/$s_!WUIV!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdf8c0e2c-d5f6-4080-bebd-5a3f9e1fbb56_1024x764.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>(Special thanks to <a href="https://twitter.com/zachrenwick/status/1740409642717761667">Zach</a> for this point)</p><p>There is no single way to write dbt models. But there are some dbt practices that are <a href="https://docs.getdbt.com/best-practices/how-we-structure/1-guide-overview">suggested by the dbt</a> itself and the community. But this hides one problem &#8212; this may be not ideal for every data stack. Here is why.</p><p>dbt is undoubtedly a great tool for abstracting the complexity of data engineering. It allows data analysts and analytics engineers to focus on data models rather than getting tangled up in the intricacies of DDL, incremental updates, and so on. However, there is a caveat. While the same code may perform exceptionally well in Snowflake, it may not work as effectively in other databases, such as BigQuery.</p><p>I once encountered an issue while working with dynamically partitioned tables in BigQuery. Despite having what seemed to be correct code, I consistently faced table full-scans. Upon investigation, I discovered that my <em>is_incremental()</em> condition, which I blindly copied from Snowflake code, did not function the same way in BigQuery. This triggered expensive full-scans. Reading the <a href="https://docs.getdbt.com/reference/resource-configs/bigquery-configs#dynamic-partitions">documentation</a> helped me find the proper approach. Initially, the problem was not obvious since the code appeared to work and dbt did not raise any complaints. However, it was not optimal and incurred additional costs.</p><p>That&#8217;s why learning models optimization should be one of the main priorities next year. In the current microeconomics environment, cost containments are gonna be top priorities for many companies.</p><p>Okay, since we mentioned the topic of learning, let's discuss this field separately.</p><h1>&#129489;&#8205;&#127979;&nbsp;More ways to learn</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Qpmi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c46c35-4897-4947-bd99-613dffb5ed99_1024x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Qpmi!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c46c35-4897-4947-bd99-613dffb5ed99_1024x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!Qpmi!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c46c35-4897-4947-bd99-613dffb5ed99_1024x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!Qpmi!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c46c35-4897-4947-bd99-613dffb5ed99_1024x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Qpmi!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c46c35-4897-4947-bd99-613dffb5ed99_1024x768.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Qpmi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c46c35-4897-4947-bd99-613dffb5ed99_1024x768.png" width="1024" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f8c46c35-4897-4947-bd99-613dffb5ed99_1024x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1856687,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Qpmi!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c46c35-4897-4947-bd99-613dffb5ed99_1024x768.png 424w, /__u/substackcdn.com/image/fetch/$s_!Qpmi!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c46c35-4897-4947-bd99-613dffb5ed99_1024x768.png 848w, /__u/substackcdn.com/image/fetch/$s_!Qpmi!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c46c35-4897-4947-bd99-613dffb5ed99_1024x768.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Qpmi!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff8c46c35-4897-4947-bd99-613dffb5ed99_1024x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Next year, there will be a lot of opportunities to learn dbt and Analytics Engineering. Knowledge is becoming increasingly accessible and easier to get. It is truly an exciting time to be in data!</p><p>I would like to suggest a few methods for learning the subject.</p><h3>Courses</h3><p>For beginners I&#8217;d recommend start with the <a href="https://courses.getdbt.com/collections">official free courses</a> from dbt Labs. In there you will find a lot of topics, from fundamentals to advanced.</p><p>For middle and senior developers there are a plenty of high-quality paid courses. I can highly recommend &#8220;<a href="https://uplimit.com/course/analytics-engineering-with-dbt">Analytics engineering with dbt</a>&#8221; from <a href="https://www.linkedin.com/in/hawkinsemily/">Emily Hawking</a> and &#8220;<a href="https://uplimit.com/course/advanced-dbt">Advanced dbt</a>&#8221; from <a href="https://www.linkedin.com/in/lindsaymurphy4/">Lindsay Murphy</a>. I've been on both and I truly believe these are top-notch courses!</p><h3>Newsletters</h3><p>Newsletters are a great way to acquire knowledge without actively participating in online sessions and scheduled calls, like in online courses. You receive periodic updates and can read news and tips at your own convenience asynchronously. Also, newsletters are great regardless of your experience level. Both juniors and seniors can find something useful in them.</p><p>Here are my recommendations:</p><ul><li><p>First and foremost, subscribe to the official newsletter from dbt &#8212; &#8220;<a href="https://roundup.getdbt.com/">Analytics Engineering Roundup</a>&#8221;. I&#8217;ve been subscriber of it for a long-long time and learned quite a few things out of it.</p></li><li><p>Next, try &#8221;<a href="/__u/learnanalyticsengineering.substack.com/">Learn Analytics Engineering</a>&#8221; from <a href="https://www.linkedin.com/in/schottmadison/">Madison Schott</a>. This is a high-quality newsletter about everything Analytics Engineering, including tutorials and articles on general topics. Love it!</p></li><li><p>And finally, consider subscribing to my <a href="/__u/dbtips.substack.com/">#dbtips</a> newsletter, where I also talk about dbt and Analytics Engineering.</p></li></ul><h3>Podcasts</h3><p>My only suggestion for podcasts is going to be "The Analytics Engineering Podcast" from dbt Labs (<a href="https://open.spotify.com/show/4BKMMeVXk4jJnAQSqGSJvE?si=19d22f1f73d244f5">Spotify link</a>, but I think you can find it in many other places as well). New episodes are released once or twice per month, so it won't be annoying.</p><p>Feel free to recommend any other podcasts (or any other leaning resources) you found useful.</p><div><hr></div><p>For sure, 2024 is going to be an awesome year for Analytics Engineering and for data industry in general. There are a few challenges ahead, but also cool new technologies and breakthroughs. I&#8217;ll repeat it once again &#8212; it&#8217;s really an awesome time to be in data!</p><p>Happy New Year! &#129395;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to #dbtips now!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[dbt basics refresher]]></title><description><![CDATA[Sometimes, it can be useful to go back to where it started]]></description><link>https://dbtips.substack.com/p/dbt-basics-refresher</link><guid isPermaLink="false">https://dbtips.substack.com/p/dbt-basics-refresher</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Tue, 05 Dec 2023 19:22:29 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2OVa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe41bab6b-25f3-457b-9576-2113823285d2_960x540.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!2OVa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe41bab6b-25f3-457b-9576-2113823285d2_960x540.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!2OVa!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe41bab6b-25f3-457b-9576-2113823285d2_960x540.png 424w, /__u/substackcdn.com/image/fetch/$s_!2OVa!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe41bab6b-25f3-457b-9576-2113823285d2_960x540.png 848w, /__u/substackcdn.com/image/fetch/$s_!2OVa!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe41bab6b-25f3-457b-9576-2113823285d2_960x540.png 1272w, /__u/substackcdn.com/image/fetch/$s_!2OVa!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe41bab6b-25f3-457b-9576-2113823285d2_960x540.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!2OVa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe41bab6b-25f3-457b-9576-2113823285d2_960x540.png" width="960" height="540" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e41bab6b-25f3-457b-9576-2113823285d2_960x540.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:540,&quot;width&quot;:960,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19543,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!2OVa!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe41bab6b-25f3-457b-9576-2113823285d2_960x540.png 424w, /__u/substackcdn.com/image/fetch/$s_!2OVa!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe41bab6b-25f3-457b-9576-2113823285d2_960x540.png 848w, /__u/substackcdn.com/image/fetch/$s_!2OVa!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe41bab6b-25f3-457b-9576-2113823285d2_960x540.png 1272w, /__u/substackcdn.com/image/fetch/$s_!2OVa!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe41bab6b-25f3-457b-9576-2113823285d2_960x540.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When working with some technology long enough you take a lot of things as granted. But it's always a good idea to refresh your knowledge and revisit the basics. This helps to ensure that you have a solid understanding of the fundamentals and can build on them effectively.</p><p>Furthermore, I believe that revisiting the basics also helps you acquire new knowledge. For instance, you may understand how certain components or processes function, but it is likely that you only utilize them in situations where you feel confident. However, the reality is that sometimes applying "basic" concepts can be much wiser.</p><p>So, let&#8217;s take some time to review the core concepts of dbt to enhance your skills and stay up to date with the latest advancements in the field.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>What is dbt?</h1><p>dbt is an open-source tool which ultimate goal is to help you build modular, reusable, and high-quality data models that can help your business answer its analytics questions.</p><p>I believe the latter is very important. If you provide value to the business, you are already using dbt correctly. Everything else is just optimizing the tool's usage.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Ol_3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6963283-81d2-4808-aeba-9ccd3cbbbc60_949x285.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Ol_3!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6963283-81d2-4808-aeba-9ccd3cbbbc60_949x285.png 424w, /__u/substackcdn.com/image/fetch/$s_!Ol_3!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6963283-81d2-4808-aeba-9ccd3cbbbc60_949x285.png 848w, /__u/substackcdn.com/image/fetch/$s_!Ol_3!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6963283-81d2-4808-aeba-9ccd3cbbbc60_949x285.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Ol_3!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6963283-81d2-4808-aeba-9ccd3cbbbc60_949x285.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Ol_3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6963283-81d2-4808-aeba-9ccd3cbbbc60_949x285.png" width="949" height="285" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a6963283-81d2-4808-aeba-9ccd3cbbbc60_949x285.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:285,&quot;width&quot;:949,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20408,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Ol_3!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6963283-81d2-4808-aeba-9ccd3cbbbc60_949x285.png 424w, /__u/substackcdn.com/image/fetch/$s_!Ol_3!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6963283-81d2-4808-aeba-9ccd3cbbbc60_949x285.png 848w, /__u/substackcdn.com/image/fetch/$s_!Ol_3!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6963283-81d2-4808-aeba-9ccd3cbbbc60_949x285.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Ol_3!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa6963283-81d2-4808-aeba-9ccd3cbbbc60_949x285.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>From the other perspective, dbt started in 2016 as a way to bring software engineering practices into data analytics. Most straightforward purpose of dbt is to organize your data models into understandable pipeline. So instead of a big pile of unconnected SQL scripts you get a DAG (direct acyclic graph). On top of that, you get all the practices of software engineering, like tests, version control, core review, CI/CD, etc.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!ZPwa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76fecf1-34d9-456f-ade0-d350a5aae911_878x327.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!ZPwa!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76fecf1-34d9-456f-ade0-d350a5aae911_878x327.png 424w, /__u/substackcdn.com/image/fetch/$s_!ZPwa!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76fecf1-34d9-456f-ade0-d350a5aae911_878x327.png 848w, /__u/substackcdn.com/image/fetch/$s_!ZPwa!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76fecf1-34d9-456f-ade0-d350a5aae911_878x327.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ZPwa!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76fecf1-34d9-456f-ade0-d350a5aae911_878x327.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!ZPwa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76fecf1-34d9-456f-ade0-d350a5aae911_878x327.png" width="878" height="327" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f76fecf1-34d9-456f-ade0-d350a5aae911_878x327.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:327,&quot;width&quot;:878,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:27285,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!ZPwa!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76fecf1-34d9-456f-ade0-d350a5aae911_878x327.png 424w, /__u/substackcdn.com/image/fetch/$s_!ZPwa!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76fecf1-34d9-456f-ade0-d350a5aae911_878x327.png 848w, /__u/substackcdn.com/image/fetch/$s_!ZPwa!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76fecf1-34d9-456f-ade0-d350a5aae911_878x327.png 1272w, /__u/substackcdn.com/image/fetch/$s_!ZPwa!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff76fecf1-34d9-456f-ade0-d350a5aae911_878x327.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h1>How dbt works, exactly?</h1><p>To understand how dbt works internally you really need to understand it&#8217;s 4 topics:</p><ul><li><p>Jinja templating</p></li><li><p>CLI commands</p></li><li><p>Sources and seeds</p></li><li><p>Compiled models</p></li></ul><p>Let&#8217;s refresh all of them today.</p><h2>Jinja templating</h2><p><a href="https://jinja.palletsprojects.com/">Jinja</a> is the magic behind dbt.</p><p>It allows us to write dynamic SQL. Now we can do things that are normally not possible in SQL, for example:</p><ul><li><p>conditional if statements</p></li><li><p>for loops</p></li><li><p>variables (to avoid hard-code)</p></li><li><p>reusable macros</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!J0nZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc26be7d-6693-41a3-8a89-d0a26ea80157_1512x926.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!J0nZ!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc26be7d-6693-41a3-8a89-d0a26ea80157_1512x926.png 424w, /__u/substackcdn.com/image/fetch/$s_!J0nZ!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc26be7d-6693-41a3-8a89-d0a26ea80157_1512x926.png 848w, /__u/substackcdn.com/image/fetch/$s_!J0nZ!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc26be7d-6693-41a3-8a89-d0a26ea80157_1512x926.png 1272w, /__u/substackcdn.com/image/fetch/$s_!J0nZ!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc26be7d-6693-41a3-8a89-d0a26ea80157_1512x926.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!J0nZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc26be7d-6693-41a3-8a89-d0a26ea80157_1512x926.png" width="1456" height="892" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc26be7d-6693-41a3-8a89-d0a26ea80157_1512x926.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:892,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:146108,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!J0nZ!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc26be7d-6693-41a3-8a89-d0a26ea80157_1512x926.png 424w, /__u/substackcdn.com/image/fetch/$s_!J0nZ!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc26be7d-6693-41a3-8a89-d0a26ea80157_1512x926.png 848w, /__u/substackcdn.com/image/fetch/$s_!J0nZ!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc26be7d-6693-41a3-8a89-d0a26ea80157_1512x926.png 1272w, /__u/substackcdn.com/image/fetch/$s_!J0nZ!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc26be7d-6693-41a3-8a89-d0a26ea80157_1512x926.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Worth mention, that Jinja is not invented by dbt, it&#8217;s a templating engine by its own. It is used in some Python web frameworks, like Flask or Django.</p><p>Jinja also has a concise syntax. There are three main templates that you will need to use:</p><ul><li><p>Expressions <code>{{..}}</code> are used to output a values, usually a string. You can output a variable or a result of macro.</p></li><li><p>Statements <code>{%..%}</code> are used for control flows, e.g. to set up &#8220;for&#8221; loops or &#8220;if&#8221; statements.</p></li><li><p>Comments <code>{#..#}</code> are Jinja comments and they won&#8217;t be compiled and rendered.</p></li></ul><blockquote><p>&#9888;&#65039;&nbsp;One common mistake I see often is commenting out Jinja code with SQL comments. Such code will still be compiled!</p></blockquote><p>Data warehouses do not understand Jinja. Therefore, Jinja code needs to be compiled before executing it in the database. I will discuss the compiling process in the last section, but I wanted to clarify this here to avoid any confusion about running Jinja code in the database.</p><p>One of the most useful Jinja code in dbt is <a href="https://docs.getdbt.com/reference/dbt-jinja-functions/ref">ref()</a> macro. It helps dbt understand dependencies between models and allows to avoiding table name hardcoding (because <em>ref()</em> macro will be translated to the real name of table/relation during compilation).</p><p>Finally, here are a few interesting pieces about <code>ref</code> macro:</p><ol><li><p>It is possible to do referencing &#8220;<a href="https://docs.getdbt.com/reference/dbt-jinja-functions/ref#forcing-dependencies">without</a>&#8221; ref in FROM, by specifying a special SQL comment.</p></li><li><p><em>ref()</em> macro actually can take two arguments for more <a href="https://docs.getdbt.com/reference/dbt-jinja-functions/ref#two-argument-variant">explicit referencing</a> (first argument is a project name, useful for external packages and better visibility).</p></li><li><p>Since dbt models can have versions, you can add <a href="https://docs.getdbt.com/reference/resource-properties/versions">model</a> <a href="https://docs.getdbt.com/docs/collaborate/govern/model-versions#run-a-model-with-multiple-versions">version</a> along with its reference name.</p></li></ol><p>Here is an <a href="https://docs.getdbt.com/guides/using-jinja?step=1">awesome Jinja guide</a> from dbt team itself.</p><h2>CLI commands</h2><p>dbt was initially invented as CLI tool. And for vast majority of features it still is a CLI tool. That&#8217;s why it is vital to know how to use dbt in the command line.</p><p>Here is a shortlist of my most used dbt commands:</p><ul><li><p><em>dbt debug</em> &#8212; used to check dbt project health and database connection</p></li><li><p><em>dbt run</em> &#8212; runs the models in a project, probably most used command in any project</p></li><li><p><em>dbt compile</em> &#8212; helps you compile models in the project, could be useful for debugging purposes</p></li><li><p><em>dbt build</em> &#8212; a command to build and test all dbt resources (models, seeds, snapshots, tests). can be very handy when running in Production</p></li></ul><p>All commands above are going to run all models in your project. It may be not needed in all cases, for example during development stage. So all commands support selection syntax which allows you to run only a subset of models.</p><p>Selection is implemented with <em>--select</em> argument that limits commands only to the specific models:</p><pre><code><code>dbt run --select model_a

# this is the same as above, but shortened
dbt run -s my_model

# run several models
dbt run -s model_a model_b
</code></code></pre><p>Sometimes you may want to run a model along with all its dependencies, or a model and its parents, etc. To achieve that you could use selector modifiers:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Ifmt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29b51f11-29a6-470d-860a-2274e56b3f33_956x413.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Ifmt!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29b51f11-29a6-470d-860a-2274e56b3f33_956x413.png 424w, /__u/substackcdn.com/image/fetch/$s_!Ifmt!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29b51f11-29a6-470d-860a-2274e56b3f33_956x413.png 848w, /__u/substackcdn.com/image/fetch/$s_!Ifmt!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29b51f11-29a6-470d-860a-2274e56b3f33_956x413.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Ifmt!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29b51f11-29a6-470d-860a-2274e56b3f33_956x413.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Ifmt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29b51f11-29a6-470d-860a-2274e56b3f33_956x413.png" width="956" height="413" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/29b51f11-29a6-470d-860a-2274e56b3f33_956x413.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:413,&quot;width&quot;:956,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48217,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Ifmt!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29b51f11-29a6-470d-860a-2274e56b3f33_956x413.png 424w, /__u/substackcdn.com/image/fetch/$s_!Ifmt!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29b51f11-29a6-470d-860a-2274e56b3f33_956x413.png 848w, /__u/substackcdn.com/image/fetch/$s_!Ifmt!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29b51f11-29a6-470d-860a-2274e56b3f33_956x413.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Ifmt!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29b51f11-29a6-470d-860a-2274e56b3f33_956x413.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Sources and seeds</h2><p><a href="https://docs.getdbt.com/docs/build/sources">Sources</a> are used to describe the data that already exists in your data warehouse. In dbt, you will use sources to build your models.</p><p>Sources are described in <em>.yaml</em> files. You can define multiple sources and multiple tables inside one source:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!AU_V!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77963115-e065-449f-bd45-79d5d103474b_932x780.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!AU_V!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77963115-e065-449f-bd45-79d5d103474b_932x780.png 424w, /__u/substackcdn.com/image/fetch/$s_!AU_V!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77963115-e065-449f-bd45-79d5d103474b_932x780.png 848w, /__u/substackcdn.com/image/fetch/$s_!AU_V!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77963115-e065-449f-bd45-79d5d103474b_932x780.png 1272w, /__u/substackcdn.com/image/fetch/$s_!AU_V!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77963115-e065-449f-bd45-79d5d103474b_932x780.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!AU_V!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77963115-e065-449f-bd45-79d5d103474b_932x780.png" width="410" height="343.13304721030045" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/77963115-e065-449f-bd45-79d5d103474b_932x780.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:780,&quot;width&quot;:932,&quot;resizeWidth&quot;:410,&quot;bytes&quot;:93622,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!AU_V!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77963115-e065-449f-bd45-79d5d103474b_932x780.png 424w, /__u/substackcdn.com/image/fetch/$s_!AU_V!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77963115-e065-449f-bd45-79d5d103474b_932x780.png 848w, /__u/substackcdn.com/image/fetch/$s_!AU_V!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77963115-e065-449f-bd45-79d5d103474b_932x780.png 1272w, /__u/substackcdn.com/image/fetch/$s_!AU_V!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F77963115-e065-449f-bd45-79d5d103474b_932x780.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>To use source in the model, use the following macro:</p><pre><code><code>{{ source('source', 'table') }}</code></code></pre><p>In the final dbt pipeline, when you want to use data source you use <em>source()</em> macro, when you want to use another dbt model you use <em>ref()</em> macro.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Rx-Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72158348-5b2f-465a-bf4f-f7ce3d143fd9_934x326.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Rx-Y!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72158348-5b2f-465a-bf4f-f7ce3d143fd9_934x326.png 424w, /__u/substackcdn.com/image/fetch/$s_!Rx-Y!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72158348-5b2f-465a-bf4f-f7ce3d143fd9_934x326.png 848w, /__u/substackcdn.com/image/fetch/$s_!Rx-Y!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72158348-5b2f-465a-bf4f-f7ce3d143fd9_934x326.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Rx-Y!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72158348-5b2f-465a-bf4f-f7ce3d143fd9_934x326.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Rx-Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72158348-5b2f-465a-bf4f-f7ce3d143fd9_934x326.png" width="934" height="326" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72158348-5b2f-465a-bf4f-f7ce3d143fd9_934x326.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:326,&quot;width&quot;:934,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:41996,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Rx-Y!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72158348-5b2f-465a-bf4f-f7ce3d143fd9_934x326.png 424w, /__u/substackcdn.com/image/fetch/$s_!Rx-Y!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72158348-5b2f-465a-bf4f-f7ce3d143fd9_934x326.png 848w, /__u/substackcdn.com/image/fetch/$s_!Rx-Y!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72158348-5b2f-465a-bf4f-f7ce3d143fd9_934x326.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Rx-Y!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72158348-5b2f-465a-bf4f-f7ce3d143fd9_934x326.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Each data source can be checked for <strong><a href="https://docs.getdbt.com/reference/resource-properties/freshness">freshness</a></strong>. You can set acceptable timeframe of data availability to consider a source &#8220;fresh&#8221;.</p><p>Freshness can be set either for the whole source set of for each table separately. To trigger freshness check you need to use the following command:</p><pre><code><code>dbt freshness</code></code></pre><p>Several advanced cases of advanced usage of dbt sources:</p><ul><li><p>Freshness is not checked during <em>dbt build</em>. If you need that, create additional step.</p></li><li><p>It&#8217;s possible to define EXTERNAL TABLE as dbt source, however you still need to use <a href="https://github.com/dbt-labs/dbt-external-tables">dbt-external-tables</a> package to update the definition in DWH.</p></li><li><p>Data source from external package can be overwritten with <a href="https://docs.getdbt.com/reference/resource-properties/overrides">overrides</a> property.</p></li></ul><p>Sometimes source data can be defined in a static file, for example CSV file with some mappings. These are called <em>seeds</em> in dbt.</p><p><a href="https://docs.getdbt.com/docs/build/seeds">Seeds</a> are used to load static data into your data warehouse. Seeds are .csv files located in <em>/seeds</em> folder within your dbt project. Seeds are useful when you have a data that doesn't change frequently, such as dictionaries, lookup tables, or other types of static data.</p><p>For better compatibility with DWH it is recommended to create <em><a href="https://docs.getdbt.com/reference/seed-configs">.yml</a></em><a href="https://docs.getdbt.com/reference/seed-configs"> file</a> with data types and definitions.</p><h2>Compiled models</h2><p>Finally, let's discuss the <em>compilation of dbt models</em>. As mentioned earlier, our databases cannot read Jinja code directly from our models. Therefore, before running models in the database, dbt will translate Jinja code into plain SQL code and then execute it.</p><p>Compilation is done automatically whenever you use <em>dbt run</em> command or can be done via a special command <em>dbt compile</em>.</p><p>All compiled code it stored in <em>/target</em> folder. Its content usually not committed to Git repository, because it can be easily recreated by run or compile commands.</p><p>There will be two subfolders in target:</p><ul><li><p><em>/compiled</em>&nbsp; is a folder with dbt models, <strong>directly compiled to SQL</strong>. This code, however, will not be executed in the database directly, because these are only SELECT statements.</p></li><li><p><em>/run</em> is a folder of compiled dbt models with additional DDL (data definition language) code. These scripts <strong>will be executed in the database</strong>. DDL is a code that handles the creation of tables and views, as well as the insertion of new rows for incremental models. It essentially takes care of the heavy lifting that is typically done by data engineers.</p></li></ul><p>You can use node selection syntax with compile command</p><pre><code><code>dbt compile --select users_model</code></code></pre><p>Also, you can compile an inline code, like this:</p><pre><code><code>dbt compile --inline "select * from {{ ref('orders') }}"</code></code></pre><p>Both options of running are interactive, meaning the result will be printed to the terminal.</p><blockquote><p>&#9888;&#65039;&nbsp;Compilation requires a working connection to the DWH! <a href="https://docs.getdbt.com/reference/commands/compile#faqs">Read FAQ</a> about that in the documentation.</p></blockquote><div><hr></div><p>I hope this refresher post was useful and you learned a thing or two about basic concepts of dbt. Take your time to to review these fundamentals and create a strong foundation to build upon.</p><p><em><strong>If you liked this issue please subscribe and share it with your colleagues, this greatly helps me developing this newsletter!</strong></em></p><p>See you next time &#128075;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to #dbtips!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[dbtips digest #1]]></title><description><![CDATA[dbt 1.7, docs enhancements, testing macros]]></description><link>https://dbtips.substack.com/p/dbtips-digest-1</link><guid isPermaLink="false">https://dbtips.substack.com/p/dbtips-digest-1</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Mon, 13 Nov 2023 17:51:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!byim!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40d99693-f165-45fa-8f0f-ab7736053994_2560x1440.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!byim!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40d99693-f165-45fa-8f0f-ab7736053994_2560x1440.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!byim!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40d99693-f165-45fa-8f0f-ab7736053994_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!byim!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40d99693-f165-45fa-8f0f-ab7736053994_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!byim!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40d99693-f165-45fa-8f0f-ab7736053994_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!byim!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40d99693-f165-45fa-8f0f-ab7736053994_2560x1440.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!byim!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40d99693-f165-45fa-8f0f-ab7736053994_2560x1440.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40d99693-f165-45fa-8f0f-ab7736053994_2560x1440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4636842,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!byim!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40d99693-f165-45fa-8f0f-ab7736053994_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!byim!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40d99693-f165-45fa-8f0f-ab7736053994_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!byim!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40d99693-f165-45fa-8f0f-ab7736053994_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!byim!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40d99693-f165-45fa-8f0f-ab7736053994_2560x1440.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Hello and welcome to the first issue of the <strong>#dbtips digest</strong>! In this digest, I will share short tips and quick news about dbt and analytics engineering.</p><p>I created this format because not all tips can be full-fledged posts, and it's difficult to include news in such posts. So, the digest format provides a solution.</p><p>In today's digest, I will discuss the new version of dbt core, provide a couple of tips about documentation (based on feedback from previous posts), and share a few dbt commands that I find useful in my work. Let's get started!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>dbt Core 1.7</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!gAjP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47362011-6daa-4991-b120-16ab6df7b311_1440x810.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!gAjP!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47362011-6daa-4991-b120-16ab6df7b311_1440x810.png 424w, /__u/substackcdn.com/image/fetch/$s_!gAjP!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47362011-6daa-4991-b120-16ab6df7b311_1440x810.png 848w, /__u/substackcdn.com/image/fetch/$s_!gAjP!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47362011-6daa-4991-b120-16ab6df7b311_1440x810.png 1272w, /__u/substackcdn.com/image/fetch/$s_!gAjP!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47362011-6daa-4991-b120-16ab6df7b311_1440x810.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!gAjP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47362011-6daa-4991-b120-16ab6df7b311_1440x810.png" width="1440" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/47362011-6daa-4991-b120-16ab6df7b311_1440x810.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:316275,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!gAjP!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47362011-6daa-4991-b120-16ab6df7b311_1440x810.png 424w, /__u/substackcdn.com/image/fetch/$s_!gAjP!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47362011-6daa-4991-b120-16ab6df7b311_1440x810.png 848w, /__u/substackcdn.com/image/fetch/$s_!gAjP!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47362011-6daa-4991-b120-16ab6df7b311_1440x810.png 1272w, /__u/substackcdn.com/image/fetch/$s_!gAjP!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F47362011-6daa-4991-b120-16ab6df7b311_1440x810.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>On November 2, dbt Labs released a new version of their <a href="https://github.com/dbt-labs/dbt-core/releases/tag/v1.7.0">dbt Core</a> package (v1.7). In my opinion, most of the changes in this new major version are related to the MetricFlow functionality and data contracts (really hot topics!), although some other useful features were also added. Let's discuss the most interesting changes.</p><p>Since dbt 1.6, dbt natively supports MetricFlow, which is the successor of the dbt-metrics package. MetricFlow is a tool that can generate SQL from metric configurations. In other terms, it is a Semantic Layer. In the new 1.7 version, dbt continues to enhance its functionality by adding and extending a <a href="https://docs.getdbt.com/docs/dbt-versions/core-upgrade/upgrading-to-v1.7#metricflow-enhancements">list of features</a>. If you want to better understand what a Semantic Layer is and how it is implemented through MetricFlow, I recommend reading <a href="https://docs.getdbt.com/docs/build/semantic-models">this article</a> from the official documentation. It provides a good quick start.</p><p>Command <em>dbt docs generate</em> now supports the <em>--select</em> syntax. This allows you to generate documentation only for a subset of models. This feature is particularly useful for large projects when you only need to cover a portion of your project with HTML documentation. As I understand, this is also a feature needed for their <a href="https://www.getdbt.com/product/dbt-mesh">dbt mesh</a> vision.</p><p>The <em>freshness</em> command can now <a href="https://docs.getdbt.com/docs/dbt-versions/core-upgrade/upgrading-to-v1.7#behavior-changes">automatically detect</a> the <em>loaded_at_field</em>, eliminating the need for manual configuration. However, this feature currently only works in Snowflake, so users of other adapters will need to wait for support.</p><p>There have been <a href="https://docs.getdbt.com/docs/dbt-versions/core-upgrade/upgrading-to-v1.7#model-governance">several changes</a> to dbt contracts. These changes include stricter policies for model versioning and column data types, as well as <em>access</em> configuration for models and whole folders. If you use data contracts, you will find these changes useful.</p><p>As a bonus, the <em>dbt-spine</em> <a href="https://github.com/dbt-labs/dbt-core/pull/8616">macro</a> is now included in dbt Core. Additionally, you can now set a delimiter for seeds.</p><h1>Using assets in documentation</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!yCRk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72084134-e8f0-42e1-84ce-f018411dd2bc_1440x810.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!yCRk!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72084134-e8f0-42e1-84ce-f018411dd2bc_1440x810.png 424w, /__u/substackcdn.com/image/fetch/$s_!yCRk!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72084134-e8f0-42e1-84ce-f018411dd2bc_1440x810.png 848w, /__u/substackcdn.com/image/fetch/$s_!yCRk!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72084134-e8f0-42e1-84ce-f018411dd2bc_1440x810.png 1272w, /__u/substackcdn.com/image/fetch/$s_!yCRk!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72084134-e8f0-42e1-84ce-f018411dd2bc_1440x810.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!yCRk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72084134-e8f0-42e1-84ce-f018411dd2bc_1440x810.png" width="1440" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72084134-e8f0-42e1-84ce-f018411dd2bc_1440x810.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:495500,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!yCRk!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72084134-e8f0-42e1-84ce-f018411dd2bc_1440x810.png 424w, /__u/substackcdn.com/image/fetch/$s_!yCRk!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72084134-e8f0-42e1-84ce-f018411dd2bc_1440x810.png 848w, /__u/substackcdn.com/image/fetch/$s_!yCRk!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72084134-e8f0-42e1-84ce-f018411dd2bc_1440x810.png 1272w, /__u/substackcdn.com/image/fetch/$s_!yCRk!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72084134-e8f0-42e1-84ce-f018411dd2bc_1440x810.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>After my post about <a href="/__u/dbtips.substack.com/p/create-dbt-documentation-everyone">improving dbt documentation</a>, several people have asked how to display a custom logo on the main page. Here is a step-by-step instruction.</p><p><strong>Step 1</strong>. Create a new folder called <em>/assets</em> inside your dbt folder. This folder can hold any assets you want to show in the documentation. For example, you can place your logo and other useful images there.</p><p><strong>Step 2</strong>. Configure dbt to <a href="https://docs.getdbt.com/reference/project-configs/asset-paths">support this folder</a>. You can do this by adding the following line to your <em>dbt_project.yml</em> file:</p><pre><code><code>asset-paths: ["assets"]
</code></code></pre><p><strong>Step 3</strong>. Use images from this folder in your markdown. To do that, simply use the following syntax:</p><pre><code><code>![Logo](./assets/logo.png)
</code></code></pre><p>Now use can create the most awesome dbt docs ever! &#128578;</p><h1>Completely hiding packages from docs</h1><p>Another question that several people have asked is how to completely hide dbt packages from the documentation. The issue is that if the <a href="https://github.com/dbt-labs/dbt-core/issues/8061">package contains macros</a>, it will still be visible in the documentation.</p><p>Since there is no standard solution, we will need to use some programming to achieve this. Specifically, we need to modify the <em>manifest.json</em> file and explicitly set the visibility to &#8220;False&#8221; for any external dbt packages.</p><p>For example, you can use the following <a href="https://gist.github.com/oleg-agapov/80ebcd8cdee4397d1d7df4f291c109ae">Python script</a> to accomplish this. It reads the content of the file, toggles the visibility of &#8220;dbt_utils&#8221; package (as example), and saves the changes:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!bIVx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F642bfbf5-acaf-47e7-8391-889ebf7a973f_1454x1034.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!bIVx!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F642bfbf5-acaf-47e7-8391-889ebf7a973f_1454x1034.png 424w, /__u/substackcdn.com/image/fetch/$s_!bIVx!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F642bfbf5-acaf-47e7-8391-889ebf7a973f_1454x1034.png 848w, /__u/substackcdn.com/image/fetch/$s_!bIVx!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F642bfbf5-acaf-47e7-8391-889ebf7a973f_1454x1034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!bIVx!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F642bfbf5-acaf-47e7-8391-889ebf7a973f_1454x1034.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!bIVx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F642bfbf5-acaf-47e7-8391-889ebf7a973f_1454x1034.png" width="1454" height="1034" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/642bfbf5-acaf-47e7-8391-889ebf7a973f_1454x1034.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1034,&quot;width&quot;:1454,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:212211,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!bIVx!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F642bfbf5-acaf-47e7-8391-889ebf7a973f_1454x1034.png 424w, /__u/substackcdn.com/image/fetch/$s_!bIVx!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F642bfbf5-acaf-47e7-8391-889ebf7a973f_1454x1034.png 848w, /__u/substackcdn.com/image/fetch/$s_!bIVx!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F642bfbf5-acaf-47e7-8391-889ebf7a973f_1454x1034.png 1272w, /__u/substackcdn.com/image/fetch/$s_!bIVx!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F642bfbf5-acaf-47e7-8391-889ebf7a973f_1454x1034.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This solution is certainly technical, but it provides a workaround. Feel free to use it as needed.</p><h1>Testing macros</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!02F9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5917473-d9de-478c-a354-efd0e7e65707_1440x810.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!02F9!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5917473-d9de-478c-a354-efd0e7e65707_1440x810.png 424w, /__u/substackcdn.com/image/fetch/$s_!02F9!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5917473-d9de-478c-a354-efd0e7e65707_1440x810.png 848w, /__u/substackcdn.com/image/fetch/$s_!02F9!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5917473-d9de-478c-a354-efd0e7e65707_1440x810.png 1272w, /__u/substackcdn.com/image/fetch/$s_!02F9!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5917473-d9de-478c-a354-efd0e7e65707_1440x810.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!02F9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5917473-d9de-478c-a354-efd0e7e65707_1440x810.png" width="1440" height="810" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d5917473-d9de-478c-a354-efd0e7e65707_1440x810.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:810,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:390002,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!02F9!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5917473-d9de-478c-a354-efd0e7e65707_1440x810.png 424w, /__u/substackcdn.com/image/fetch/$s_!02F9!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5917473-d9de-478c-a354-efd0e7e65707_1440x810.png 848w, /__u/substackcdn.com/image/fetch/$s_!02F9!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5917473-d9de-478c-a354-efd0e7e65707_1440x810.png 1272w, /__u/substackcdn.com/image/fetch/$s_!02F9!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5917473-d9de-478c-a354-efd0e7e65707_1440x810.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Finally, this trick I discovered recently when I was creating a new dbt macro. Macros can be difficult to debug because you have to use them in the model and constantly re-compile the model to see the end result. However, I found a workaround for this issue.</p><p>If you want to compile the macro itself, starting from dbt 1.5, you can use the <em>compile</em> command with the <em>inline</em> flag:</p><pre><code><code>dbt compile --inline "{{ my_macro('param1', ...) }}"
</code></code></pre><p>This will print a compiled code of the macro to the terminal.</p><p>If you prefer to use SQL, simply write an inline SQL query. If that seems inconvenient, you can create an analysis file. Then, you can compile the analysis file as a usual model using select syntax.</p><pre><code><code>dbt compile --select my_analysis_file
</code></code></pre><p>Or even better, you can call it with <em>dbt show</em> to preview the results itself:</p><pre><code><code>dbt show --select my_analysis_file
</code></code></pre><p>Hopefully this will make your life easier!</p><div><hr></div><p>I hope you liked this new format of content! &#128293;</p><p>Let me know in the comments what do you think! &#129300;</p><p><em><strong>If you liked this issue please subscribe and share it with your colleagues, this greatly helps me developing this newsletter!</strong></em></p><p>See you next time &#128075;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to #dbtips!</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Run dbt with GitHub Actions]]></title><description><![CDATA[An easy way to schedule your dbt jobs]]></description><link>https://dbtips.substack.com/p/run-dbt-with-github-actions</link><guid isPermaLink="false">https://dbtips.substack.com/p/run-dbt-with-github-actions</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Mon, 06 Nov 2023 17:50:56 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/28c9146d-c363-4588-b5f3-ebd1d3e75f78_2173x1439.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!29i0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0deeb5-1c63-48d7-ade4-b31d3a59f9f4_2560x1440.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!29i0!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0deeb5-1c63-48d7-ade4-b31d3a59f9f4_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!29i0!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0deeb5-1c63-48d7-ade4-b31d3a59f9f4_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!29i0!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0deeb5-1c63-48d7-ade4-b31d3a59f9f4_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!29i0!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0deeb5-1c63-48d7-ade4-b31d3a59f9f4_2560x1440.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!29i0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0deeb5-1c63-48d7-ade4-b31d3a59f9f4_2560x1440.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2a0deeb5-1c63-48d7-ade4-b31d3a59f9f4_2560x1440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:5098734,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!29i0!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0deeb5-1c63-48d7-ade4-b31d3a59f9f4_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!29i0!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0deeb5-1c63-48d7-ade4-b31d3a59f9f4_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!29i0!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0deeb5-1c63-48d7-ade4-b31d3a59f9f4_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!29i0!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2a0deeb5-1c63-48d7-ade4-b31d3a59f9f4_2560x1440.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There are several ways to run dbt jobs. For example, if you are using Apache Airflow or Dagster, you can do it there. Alternatively, you can choose to use dbt Cloud, which will manage the job execution for you.</p><p>However, if you only starting your journey with dbt, there is an alternative way &#8212; to run dbt with GitHub Actions. Simply put, Github actions is a CI/CD tool that let&#8217;s you run any type of workflow directly from your GitHub repository. It allows you to automate tasks such as running tests, building and deploying applications, and even running dbt jobs.</p><p>Let&#8217;s dive deeper into running dbt with GitHub Actions!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>Basic setup</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!QOh7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ff3546-10ea-4e27-a9e4-6e7ab308b31e_2560x1440.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!QOh7!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ff3546-10ea-4e27-a9e4-6e7ab308b31e_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!QOh7!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ff3546-10ea-4e27-a9e4-6e7ab308b31e_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!QOh7!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ff3546-10ea-4e27-a9e4-6e7ab308b31e_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!QOh7!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ff3546-10ea-4e27-a9e4-6e7ab308b31e_2560x1440.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!QOh7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ff3546-10ea-4e27-a9e4-6e7ab308b31e_2560x1440.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95ff3546-10ea-4e27-a9e4-6e7ab308b31e_2560x1440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1005000,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!QOh7!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ff3546-10ea-4e27-a9e4-6e7ab308b31e_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!QOh7!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ff3546-10ea-4e27-a9e4-6e7ab308b31e_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!QOh7!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ff3546-10ea-4e27-a9e4-6e7ab308b31e_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!QOh7!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95ff3546-10ea-4e27-a9e4-6e7ab308b31e_2560x1440.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In this post I&#8217;ll show you how to run dbt jobs with Snowflake data warehouse, but it should be easily switchable to other warehouses.</p><p>Suppose you have the following setup:</p><ol><li><p>working dbt project in some Github repository</p></li><li><p><em>profiles.yml</em> file configured with env variables (will provide example below)</p></li></ol><p><a href="https://github.com/features/actions">Github Actions</a> allow you to run any arbitrary code on their virtual machines, you only need to setup a workflow and define steps. To setup a workflow create a new file called <em>dbt_prod.yaml</em> inside of <em>.github/workflow</em> folder in your root directory. Inside you need to define a configuration of the workflow and the steps you want to perform.</p><p>The minimal workflow to execute <em>dbt run</em> on a schedule may look like this:</p><pre><code><code>name: Daily dbt production run

# CRON job to run dbt at midnight UTC(!) everyday
on:
  schedule:
    - cron: '0 0 * * *'

# Setting some Env variables to work  with profiles.yml
env:
  DBT_PROFILE_TARGET: prod
  DBT_PROFILE_USER: ${{ secrets.DBT_PROFILE_USER }}
  DBT_PROFILE_PASSWORD: ${{ secrets.DBT_PROFILE_PASSWORD }}

jobs:
  dbt_run:
    name: Scheduled dbt refresh and test
    runs-on: ubuntu-latest
    timeout-minutes: 90
    
    # Steps of the workflow:
    steps:
      - name: Checkout
&#9;uses: actions/checkout@v3

      - name: Setup Python environment
&#9;uses: actions/setup-python@v4
&#9;with:
&#9;  python-version: "3.11"

      - name: Install dependencies
&#9;run: |
          python -m pip install --upgrade pip
&#9;  python -m pip install -r requirements.txt
&#9;
      - name: Install dbt packages
&#9;run: dbt deps
        # optionally use this parameter
        # to set a main directory of dbt project:
        # working-directory: ./my_dbt_project
&#9;    &#9;
      - name: Run the models
&#9;run: dbt run
&#9;# working-directory: ./my_dbt_project
&#9;
      - name: Run tests
&#9;run: dbt test
        # working-directory: ./my_dbt_project</code></code></pre><p>The workflow is quite straightforward if you look closely.</p><p>Let's go through each step:</p><ol><li><p>Our workflow will be triggered by a Cron (a scheduler that can execute tasks at specified time).</p></li><li><p>Since dbt requires credentials to access your database, we define them as secret Github variables. I will show you how to create them shortly.</p></li><li><p>The main pipeline consists of several steps: installing python dependencies, installing dbt packages, running dbt models, and finally testing them.</p></li></ol><p>For the whole setup to work as expected you also need to have a proper <em>profiles.yml</em> file inside of your dbt project. It may look like this:</p><pre><code><code>default:
  outputs:
    prod:
      type: snowflake
      account: "abc12345.us-east-1"
      user: "{{ env_var('DBT_PROFILE_USER') }}"
      role: "daily_runner"
      password: "{{ env_var('DBT_PROFILE_PASSWORD') }}"
      database: "analytics"
      warehouse: "daily_jobs_xl"
      schema: "dbt"</code></code></pre><p>As you can see, for username and password we use env variables defined in our workflow. To create those secrets in Github go to Settings &#8594; Secrets and variables &#8594; Actions and then press &#8220;New repository secret&#8221;:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!EsKm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a777fe-fa02-4497-a806-c87ccbc51a12_2602x1400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!EsKm!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a777fe-fa02-4497-a806-c87ccbc51a12_2602x1400.png 424w, /__u/substackcdn.com/image/fetch/$s_!EsKm!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a777fe-fa02-4497-a806-c87ccbc51a12_2602x1400.png 848w, /__u/substackcdn.com/image/fetch/$s_!EsKm!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a777fe-fa02-4497-a806-c87ccbc51a12_2602x1400.png 1272w, /__u/substackcdn.com/image/fetch/$s_!EsKm!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a777fe-fa02-4497-a806-c87ccbc51a12_2602x1400.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!EsKm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a777fe-fa02-4497-a806-c87ccbc51a12_2602x1400.png" width="1456" height="783" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/49a777fe-fa02-4497-a806-c87ccbc51a12_2602x1400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:783,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:354027,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!EsKm!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a777fe-fa02-4497-a806-c87ccbc51a12_2602x1400.png 424w, /__u/substackcdn.com/image/fetch/$s_!EsKm!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a777fe-fa02-4497-a806-c87ccbc51a12_2602x1400.png 848w, /__u/substackcdn.com/image/fetch/$s_!EsKm!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a777fe-fa02-4497-a806-c87ccbc51a12_2602x1400.png 1272w, /__u/substackcdn.com/image/fetch/$s_!EsKm!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F49a777fe-fa02-4497-a806-c87ccbc51a12_2602x1400.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Once everything is ready, you can proceed to commit all the changes to the repository. At the specified time, the Cron job will trigger the workflow, which will then start updating your dbt models &#127881;!</p><p>Want more? Let&#8217;s see what else can we add to the workflow.</p><h1>Adding more steps</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!lBa5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e16c0ee-9581-4d67-b5b1-f0aead1b2342_2560x1440.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!lBa5!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e16c0ee-9581-4d67-b5b1-f0aead1b2342_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!lBa5!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e16c0ee-9581-4d67-b5b1-f0aead1b2342_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!lBa5!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e16c0ee-9581-4d67-b5b1-f0aead1b2342_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!lBa5!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e16c0ee-9581-4d67-b5b1-f0aead1b2342_2560x1440.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!lBa5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e16c0ee-9581-4d67-b5b1-f0aead1b2342_2560x1440.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0e16c0ee-9581-4d67-b5b1-f0aead1b2342_2560x1440.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1054963,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!lBa5!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e16c0ee-9581-4d67-b5b1-f0aead1b2342_2560x1440.png 424w, /__u/substackcdn.com/image/fetch/$s_!lBa5!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e16c0ee-9581-4d67-b5b1-f0aead1b2342_2560x1440.png 848w, /__u/substackcdn.com/image/fetch/$s_!lBa5!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e16c0ee-9581-4d67-b5b1-f0aead1b2342_2560x1440.png 1272w, /__u/substackcdn.com/image/fetch/$s_!lBa5!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0e16c0ee-9581-4d67-b5b1-f0aead1b2342_2560x1440.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Once you have your dbt workflow up and running with Github actions, you can start thinking about making it more advanced by adding additional steps. In this section, I will provide a few examples of how to do so.</p><h2>Seeds, freshness and docs</h2><p>If you use dbt <em><a href="https://docs.getdbt.com/reference/commands/seed">seeds</a></em> in your project you should definitely add this step to your workflow. Just add this step before your dbt run command:</p><pre><code><code>- name: Seed seeds
  run: dbt seed</code></code></pre><p>Next, if you test your sources for <em><a href="https://docs.getdbt.com/reference/resource-properties/freshness">freshness</a></em>, you should definitely add freshness test:</p><pre><code><code>- name: Check source freshness
  run: dbt freshness</code></code></pre><p>Finally, you can generate dbt <em>docs</em> and send them to S3 storage, for example. To do this, simply add the AWS CLI and copy the documentation artifacts to the storage:</p><pre><code><code>- name: Install AWS CLI
  run: |
    sudo apt update
    sudo apt install --assume-yes awscli

- name: Configure credentials for aws CLI
  uses: aws-actions/configure-aws-credentials@v2
  with:
    aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
    aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    aws-region: "us-east-1"

# Don't forget to create env variable for S3 bucket name
- name: Upload the manifest.json to S3
  run: aws s3 cp ./target/manifest.json s3://${{ env.S3_BUCKET_NAME }}/dbt-docs/manifest.json

- name: Upload the sources.json to S3
  run: aws s3 cp ./target/sources.json s3://${{ env.S3_BUCKET_NAME }}/dbt-docs/sources.json

- name: Upload index.html
  run: aws s3 cp ./target/index.html s3://${{ env.S3_BUCKET_NAME }}/dbt-docs/index.html
</code></code></pre><p>To make dbt docs available through the browser, you will need to configure it in the AWS console. However, <a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html">this task</a> is typically handled by DevOps or Cloud Engineers.</p><h2>Build instead of run</h2><p>Another way to improve your workflow is to consider using the <em>dbt build</em> command instead of <em>dbt run</em>.</p><p>The <em><a href="https://docs.getdbt.com/reference/commands/build">build</a></em> command simplifies the process by combining the seed, freshness, test, and run stages. However, depending on your specific case, you may still prefer to run each step manually and in a specified order. The choice is ultimately yours.</p><h2>CI for Pull Requests</h2><p>Github Actions can be useful not only for running periodic jobs, but also for checking the health of your project during the Pull Request stage.</p><p>For example, you can create a CI workflow that checks the quality of new code by running automated checks on each commit. This is similar to pre-commit hooks I described in <a href="/__u/dbtips.substack.com/i/137506132/automated-checks-on-each-commit">previous post</a>, but now it's done on the Github side.</p><p>The final workflow my look like this (don&#8217;t forget to create a new yaml file in <em>.github/workflows</em> folder):</p><pre><code><code>name: dbt CI pipeline

# Triggers on push to main branch
# or Pull Request to any branch
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - "*"

# Set needed env variables
env:
  DBT_PROFILE_TARGET: dev
  DBT_PROFILE_USER: ${{ secrets.DBT_PROFILE_USER }}
  DBT_PROFILE_PASSWORD: ${{ secrets.DBT_PROFILE_PASSWORD }}
  
jobs:
  ci-tests:
    name: dbt run and test CI checks
    runs-on: ubuntu-latest
    timeout-minutes: 90

    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Setup Python environment
      uses: actions/setup-python@v4
      with:
        python-version: "3.11"

    - name: Install Python dependencies
      run: |
        pip install --upgrade pip
        pip install -r requirements.txt

    - name: Install dbt deps
      run: dbt deps    

    - name: Run seeds
      run: dbt seed

    - name: Compile queries
      run: dbt compile
    
    - name: Run SQL linter
      run: sqlfluff lint ./models
    
    # Alternatively, run pre-commit hooks.
    # For this step, however, you may
    # need to have additional configuration
    - name: Run pre-commit hooks
      run: pre-commit run</code></code></pre><p>Now, every time you add new code to the repository, it will be automatically checked for common mistakes and code formatting principles.</p><div><hr></div><p>I hope it was useful and you found one or two interesting bits for yourself! &#128293;</p><p><em><strong>If you liked this issue please subscribe and share it with your colleagues, this greatly helps me developing this newsletter!</strong></em></p><p>See you next time &#128075;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to #dbtips newsletter</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Get The Ultimate Developer Experience for dbt]]></title><description><![CDATA[Few tricks to make your developer experience much better]]></description><link>https://dbtips.substack.com/p/get-the-ultimate-developer-experience</link><guid isPermaLink="false">https://dbtips.substack.com/p/get-the-ultimate-developer-experience</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Sun, 01 Oct 2023 18:30:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cTfC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6528712d-a7f5-416b-a78e-e60636639335_2400x1400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!cTfC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6528712d-a7f5-416b-a78e-e60636639335_2400x1400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!cTfC!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6528712d-a7f5-416b-a78e-e60636639335_2400x1400.png 424w, /__u/substackcdn.com/image/fetch/$s_!cTfC!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6528712d-a7f5-416b-a78e-e60636639335_2400x1400.png 848w, /__u/substackcdn.com/image/fetch/$s_!cTfC!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6528712d-a7f5-416b-a78e-e60636639335_2400x1400.png 1272w, /__u/substackcdn.com/image/fetch/$s_!cTfC!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6528712d-a7f5-416b-a78e-e60636639335_2400x1400.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!cTfC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6528712d-a7f5-416b-a78e-e60636639335_2400x1400.png" width="1456" height="849" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6528712d-a7f5-416b-a78e-e60636639335_2400x1400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:849,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2768598,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!cTfC!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6528712d-a7f5-416b-a78e-e60636639335_2400x1400.png 424w, /__u/substackcdn.com/image/fetch/$s_!cTfC!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6528712d-a7f5-416b-a78e-e60636639335_2400x1400.png 848w, /__u/substackcdn.com/image/fetch/$s_!cTfC!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6528712d-a7f5-416b-a78e-e60636639335_2400x1400.png 1272w, /__u/substackcdn.com/image/fetch/$s_!cTfC!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6528712d-a7f5-416b-a78e-e60636639335_2400x1400.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><blockquote><p>&#8220;A good tool improves the way you work. A great tool improves the way you think.&#8221; <em>Jeff Duntemann</em></p></blockquote><p>The developers of dbt made a significant effort by incorporating software development practices into the world of data modeling. This includes version control, tests, documentation, and more. As a result, the lives of data analysts and data engineers have become much easier.</p><p>However, there are many more tools and practices that can improve the developer experience. As engineers, we want to work efficiently and focus more on business needs rather than code formatting or fixing errors in YAML files.</p><p>Today, I will show you how to improve your workflow with dbt. We will start slowly by optimizing your productivity in IDE by using &#8220;dbt Power User&#8221; plugin for VSCode. After that, I will demonstrate how to do SQL linting. And finally, will show you how to implement automatic checks of different parts of the project that will greatly enhance your developer experience.</p><p>Let's get started!</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>Supercharge your IDE</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!syLB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0cb2a34-87fb-41a1-b769-73fe25257146_5824x3120.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!syLB!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0cb2a34-87fb-41a1-b769-73fe25257146_5824x3120.png 424w, /__u/substackcdn.com/image/fetch/$s_!syLB!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0cb2a34-87fb-41a1-b769-73fe25257146_5824x3120.png 848w, /__u/substackcdn.com/image/fetch/$s_!syLB!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0cb2a34-87fb-41a1-b769-73fe25257146_5824x3120.png 1272w, /__u/substackcdn.com/image/fetch/$s_!syLB!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0cb2a34-87fb-41a1-b769-73fe25257146_5824x3120.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!syLB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0cb2a34-87fb-41a1-b769-73fe25257146_5824x3120.png" width="1456" height="780" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0cb2a34-87fb-41a1-b769-73fe25257146_5824x3120.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:780,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4120762,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!syLB!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0cb2a34-87fb-41a1-b769-73fe25257146_5824x3120.png 424w, /__u/substackcdn.com/image/fetch/$s_!syLB!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0cb2a34-87fb-41a1-b769-73fe25257146_5824x3120.png 848w, /__u/substackcdn.com/image/fetch/$s_!syLB!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0cb2a34-87fb-41a1-b769-73fe25257146_5824x3120.png 1272w, /__u/substackcdn.com/image/fetch/$s_!syLB!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0cb2a34-87fb-41a1-b769-73fe25257146_5824x3120.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When developing in dbt, you typically work with a code editor (for SQL and Jinja) and a terminal (especially if you are a dbt Core user). One issue that dbt developers often face is the lack of good support for SQL + Jinja syntax in IDEs. So, let's fix that first.</p><p>I am a big fan of the <a href="https://code.visualstudio.com/">VSCode</a>. It provides excellent support for all major languages, such as Python, and offers a pleasant working experience. Additionally, it can be greatly enhanced by using plugins. Fortunately for us, there is a plugin specifically designed for dbt called "<a href="https://marketplace.visualstudio.com/items?itemName=innoverio.vscode-dbt-power-user">dbt Power User</a>".</p><p>Installing the plugin is easy &#8212; basically you need to find it on the marketplace and install. Additionally, install official <a href="https://marketplace.visualstudio.com/items?itemName=ms-python.python">Python plugin</a>, because dbt Power User depends on it. For most setups it should be sufficient. Now let&#8217;s see what is possible with it.</p><p>First of all, you are getting a contextual menu that can tell you a lot about the model: its parents and children, available tests and documentation and even a model lineage!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!qKv8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b7ba21-4147-4947-8f45-bf521b54869e_3021x1522.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!qKv8!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b7ba21-4147-4947-8f45-bf521b54869e_3021x1522.png 424w, /__u/substackcdn.com/image/fetch/$s_!qKv8!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b7ba21-4147-4947-8f45-bf521b54869e_3021x1522.png 848w, /__u/substackcdn.com/image/fetch/$s_!qKv8!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b7ba21-4147-4947-8f45-bf521b54869e_3021x1522.png 1272w, /__u/substackcdn.com/image/fetch/$s_!qKv8!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b7ba21-4147-4947-8f45-bf521b54869e_3021x1522.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!qKv8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b7ba21-4147-4947-8f45-bf521b54869e_3021x1522.png" width="1456" height="734" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/09b7ba21-4147-4947-8f45-bf521b54869e_3021x1522.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:734,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1099620,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!qKv8!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b7ba21-4147-4947-8f45-bf521b54869e_3021x1522.png 424w, /__u/substackcdn.com/image/fetch/$s_!qKv8!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b7ba21-4147-4947-8f45-bf521b54869e_3021x1522.png 848w, /__u/substackcdn.com/image/fetch/$s_!qKv8!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b7ba21-4147-4947-8f45-bf521b54869e_3021x1522.png 1272w, /__u/substackcdn.com/image/fetch/$s_!qKv8!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F09b7ba21-4147-4947-8f45-bf521b54869e_3021x1522.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Additionally, you get a lot of additional perks like:</p><ul><li><p>contextual suggestions of model names:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!J5Di!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f2841-d0c8-4378-8686-d140bb419df3_1588x298.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!J5Di!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f2841-d0c8-4378-8686-d140bb419df3_1588x298.png 424w, /__u/substackcdn.com/image/fetch/$s_!J5Di!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f2841-d0c8-4378-8686-d140bb419df3_1588x298.png 848w, /__u/substackcdn.com/image/fetch/$s_!J5Di!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f2841-d0c8-4378-8686-d140bb419df3_1588x298.png 1272w, /__u/substackcdn.com/image/fetch/$s_!J5Di!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f2841-d0c8-4378-8686-d140bb419df3_1588x298.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!J5Di!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f2841-d0c8-4378-8686-d140bb419df3_1588x298.png" width="1456" height="273" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0c7f2841-d0c8-4378-8686-d140bb419df3_1588x298.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:273,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:77160,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!J5Di!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f2841-d0c8-4378-8686-d140bb419df3_1588x298.png 424w, /__u/substackcdn.com/image/fetch/$s_!J5Di!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f2841-d0c8-4378-8686-d140bb419df3_1588x298.png 848w, /__u/substackcdn.com/image/fetch/$s_!J5Di!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f2841-d0c8-4378-8686-d140bb419df3_1588x298.png 1272w, /__u/substackcdn.com/image/fetch/$s_!J5Di!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0c7f2841-d0c8-4378-8686-d140bb419df3_1588x298.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div></li><li><p>automatic generation of staging tables based on the source configuration</p></li><li><p>data preview</p></li><li><p>compile a single model using a key shortcut</p></li><li><p>and many more!</p></li></ul><p>This plugin is a valuable asset for all dbt developers. Master it and increase your productivity by x100 times!</p><h1>Lint and format SQL</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!QNFY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02324a8-1053-4166-9c64-264890bfaf0e_4264x2398.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!QNFY!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02324a8-1053-4166-9c64-264890bfaf0e_4264x2398.png 424w, /__u/substackcdn.com/image/fetch/$s_!QNFY!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02324a8-1053-4166-9c64-264890bfaf0e_4264x2398.png 848w, /__u/substackcdn.com/image/fetch/$s_!QNFY!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02324a8-1053-4166-9c64-264890bfaf0e_4264x2398.png 1272w, /__u/substackcdn.com/image/fetch/$s_!QNFY!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02324a8-1053-4166-9c64-264890bfaf0e_4264x2398.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!QNFY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02324a8-1053-4166-9c64-264890bfaf0e_4264x2398.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e02324a8-1053-4166-9c64-264890bfaf0e_4264x2398.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1843617,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!QNFY!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02324a8-1053-4166-9c64-264890bfaf0e_4264x2398.png 424w, /__u/substackcdn.com/image/fetch/$s_!QNFY!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02324a8-1053-4166-9c64-264890bfaf0e_4264x2398.png 848w, /__u/substackcdn.com/image/fetch/$s_!QNFY!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02324a8-1053-4166-9c64-264890bfaf0e_4264x2398.png 1272w, /__u/substackcdn.com/image/fetch/$s_!QNFY!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe02324a8-1053-4166-9c64-264890bfaf0e_4264x2398.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Linting and formatting of SQL is very important when you work in a team. Without actively aligning and enforcing conventions, your project can quickly become disorganized, which can negatively impact readability and overall developer experience.</p><p>To address this, I recommend using a tool called <a href="https://sqlfluff.com/">SQLFluff</a>. This open-source tool can be used to lint and format your SQL code. It provides numerous <a href="https://docs.sqlfluff.com/en/stable/rules.html">stylistic rules</a> and coding conventions that will help maintain a high standard for your code base.</p><p>Installing SQLFluff into your project requires several steps:</p><ol><li><p>Install the tool itself along with an additional plugin for dbt:</p><pre><code><code>pip install sqlfluff sqlfluff-templater-dbt</code></code></pre></li><li><p>Add <em>.sqlfluffignore</em> file to exclude some folders from checking:</p><pre><code><code>analysis/
macros/
dbt_packages/
target/</code></code></pre></li><li><p>Add <em>.sqlfluff</em> file to configure <a href="https://docs.sqlfluff.com/en/stable/rules.html">SQL rules</a>. Start simple, add more with time:</p><pre><code><code>[sqlfluff]
templater = dbt
max_line_length = 80
dialect = snowflake

[sqlfluff:templater:dbt]
apply_dbt_builtins = true
profile = my_dbt_profile
project_dir = ./my_dbt_project
profiles_dir = ~/.dbt

[sqlfluff:indentation]
indent_unit = space
indented_ctes = False
indented_joins = True
indented_using_on = True
indented_on_contents = True
tab_space_size = 4
template_blocks_indent = True

[sqlfluff:layout:type:comma]
spacing_before = touch
line_position = trailing

[sqlfluff:templater:jinja]
apply_dbt_builtins = true</code></code></pre></li></ol><p>Now you can use SQLFluff in the terminal. To lint all models from the "marts/" folder, simply run the following command:</p><pre><code><code>$ sqlfluff lint models/marts



sqlfluff lint my_dbt_project/models/marts/
=== [dbt templater] Sorting Nodes...
=== [dbt templater] Compiling dbt project...
=== [dbt templater] Project Compiled.
== [my_dbt_project/models/marts/core/fact_orders.sql] FAIL
L:  26 | P:  40 | AL01 | Implicit/explicit aliasing of table.
                       | [aliasing.table]
L:  27 | P:   1 | LT02 | Expected indent of 4 spaces.
                       | [layout.indent]
L:  27 | P:  48 | AL01 | Implicit/explicit aliasing of table.
                       | [aliasing.table]
L:  28 | P:   1 | LT02 | Expected indent of 8 spaces.
                       | [layout.indent]
L:  29 | P:   1 | LT02 | Expected indent of 4 spaces.
                       | [layout.indent]
L:  29 | P:  30 | AL01 | Implicit/explicit aliasing of table.
                       | [aliasing.table]
L:  29 | P:  31 | LT01 | Unnecessary trailing whitespace.
                       | [layout.spacing]
L:  30 | P:   1 | LT02 | Expected indent of 8 spaces.
                       | [layout.indent]</code></code></pre><p>You will see the output from the linter, which shows the rules that your SQL code violates. From here, you can decide whether to fix the errors or adjust the rules.</p><p>SQLFluff can also automatically reformat the code to comply with the rules:</p><pre><code><code>sqlfluff fix models/marts/core/fact_user_orders.sql</code></code></pre><p>And that's basically it. Now you have a functional linting and formatting tool to help you maintain clean and consistent SQL code!</p><h1>Automated checks on each commit</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!tl7l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877dbb22-3a3b-46b8-a64c-192899a072ac_4032x2268.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!tl7l!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877dbb22-3a3b-46b8-a64c-192899a072ac_4032x2268.png 424w, /__u/substackcdn.com/image/fetch/$s_!tl7l!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877dbb22-3a3b-46b8-a64c-192899a072ac_4032x2268.png 848w, /__u/substackcdn.com/image/fetch/$s_!tl7l!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877dbb22-3a3b-46b8-a64c-192899a072ac_4032x2268.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tl7l!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877dbb22-3a3b-46b8-a64c-192899a072ac_4032x2268.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!tl7l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877dbb22-3a3b-46b8-a64c-192899a072ac_4032x2268.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/877dbb22-3a3b-46b8-a64c-192899a072ac_4032x2268.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1712150,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!tl7l!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877dbb22-3a3b-46b8-a64c-192899a072ac_4032x2268.png 424w, /__u/substackcdn.com/image/fetch/$s_!tl7l!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877dbb22-3a3b-46b8-a64c-192899a072ac_4032x2268.png 848w, /__u/substackcdn.com/image/fetch/$s_!tl7l!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877dbb22-3a3b-46b8-a64c-192899a072ac_4032x2268.png 1272w, /__u/substackcdn.com/image/fetch/$s_!tl7l!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F877dbb22-3a3b-46b8-a64c-192899a072ac_4032x2268.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Finally, let's discuss more advanced topic of automation &#8212; <a href="https://pre-commit.com/">pre-commit</a> hooks. These are small scripts that can automatically run whenever you commit your code to the Git repository. Within these scripts, we can perform various checks to identify potential issues with the project and notify you of any problems. These checks are necessary to prevent you from committing faulty code that can cause issues.</p><p>In general, pre-commit hooks can work with any type of code, such as Python, NodeJS, PHP, etc., thanks to their extensions. Fortunately, there is also an extension available for working with dbt.</p><p>What can these hooks do? They can actually check a lot of stuff, including:</p><ul><li><p>Validity of YAML files (e.g., sources and schema documentation)</p></li><li><p>General formatting of files (e.g., add missing end-of-line, or replacing double quotes with single quotes)</p></li><li><p>Check SQL code using SQLFluff</p></li><li><p>Presence of documentation for all models</p></li><li><p>Accuracy of documentation itself (e.g., ensuring all columns from a model are documented)</p></li><li><p>Availability of tests</p></li><li><p>and many more</p></li></ul><p>To install pre-commit hooks you need to install the Python package itself and then add needed checks:</p><ol><li><p>Install the package:</p><pre><code><code>pip install pre-commit</code></code></pre></li><li><p>Create <em>.pre-commit-config.yaml</em> file and place hooks:</p><pre><code><code>repos:
  - repo: &lt;https://github.com/pre-commit/pre-commit-hooks&gt;
    rev: v4.4.0
    hooks:
      - id: check-yaml
      - id: end-of-file-fixer
      - id: trailing-whitespace

  - repo: &lt;https://github.com/sqlfluff/sqlfluff&gt;
    rev: 2.1.2
    hooks:
      - id: sqlfluff-lint
        additional_dependencies: [
          'dbt-snowflake',
          'sqlfluff-templater-dbt'
        ]

  - repo: &lt;https://github.com/dbt-checkpoint/dbt-checkpoint&gt;
    rev: v1.1.1
    hooks:
    - id: dbt-compile
    - id: dbt-docs-generate
    - id: check-source-table-has-description
    - id: check-model-has-tests
      args: ["--test-cnt", "1", "--"]
    - id: check-script-semicolon
    - id: check-script-has-no-table-name
    - id: check-model-has-all-columns</code></code></pre></li></ol><p>Next you may run all checks manually by running a command:</p><pre><code><code>pre-commit run --all-files</code></code></pre><p>Or by installing those hooks as preliminary step for &#8220;git commit&#8221; command with:</p><pre><code><code>pre-commit install</code></code></pre><p>The latter will write pre-commit configuration to the <em>.git/hooks</em> folder. From now on, whenever you make any commits, the pre-commit checks will be executed first.</p><div><hr></div><p>That&#8217;s it for today!</p><p><em><strong>If you liked this issue please subscribe and share it with your colleagues, this greatly helps me developing this newsletter!</strong></em></p><p>See you next time &#128075;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to #dbtips newsletter</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Create dbt Documentation Everyone Loves]]></title><description><![CDATA[Just a few tricks that will make your documentation look stunning]]></description><link>https://dbtips.substack.com/p/create-dbt-documentation-everyone</link><guid isPermaLink="false">https://dbtips.substack.com/p/create-dbt-documentation-everyone</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Mon, 11 Sep 2023 18:50:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!a6Gm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7725860-697a-4626-b3e7-8f62bbee6e3c_1536x980.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!a6Gm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7725860-697a-4626-b3e7-8f62bbee6e3c_1536x980.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!a6Gm!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7725860-697a-4626-b3e7-8f62bbee6e3c_1536x980.png 424w, /__u/substackcdn.com/image/fetch/$s_!a6Gm!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7725860-697a-4626-b3e7-8f62bbee6e3c_1536x980.png 848w, /__u/substackcdn.com/image/fetch/$s_!a6Gm!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7725860-697a-4626-b3e7-8f62bbee6e3c_1536x980.png 1272w, /__u/substackcdn.com/image/fetch/$s_!a6Gm!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7725860-697a-4626-b3e7-8f62bbee6e3c_1536x980.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!a6Gm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7725860-697a-4626-b3e7-8f62bbee6e3c_1536x980.png" width="1456" height="929" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b7725860-697a-4626-b3e7-8f62bbee6e3c_1536x980.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:929,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1266222,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!a6Gm!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7725860-697a-4626-b3e7-8f62bbee6e3c_1536x980.png 424w, /__u/substackcdn.com/image/fetch/$s_!a6Gm!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7725860-697a-4626-b3e7-8f62bbee6e3c_1536x980.png 848w, /__u/substackcdn.com/image/fetch/$s_!a6Gm!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7725860-697a-4626-b3e7-8f62bbee6e3c_1536x980.png 1272w, /__u/substackcdn.com/image/fetch/$s_!a6Gm!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb7725860-697a-4626-b3e7-8f62bbee6e3c_1536x980.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One of the things I appreciate about dbt is the ability to generate documentation for my models. I find it helpful that the code and corresponding documentation can exist together in the same codebase. This makes it simpler to create and maintain.</p><p>The default documentation generated by dbt is a good starting point. It provides a foundation, including a list of models, relationships between models, and a visual DAG with dependencies. However, we can enhance it further with a few simple tweaks.</p><p>Let me share my favorite recipes for creating dbt documentation that everyone will love to use.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>Upgrade your starting page</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!IEvK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c85de50-9931-410a-a160-dc5769755ffc_3544x2288.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!IEvK!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c85de50-9931-410a-a160-dc5769755ffc_3544x2288.png 424w, /__u/substackcdn.com/image/fetch/$s_!IEvK!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c85de50-9931-410a-a160-dc5769755ffc_3544x2288.png 848w, /__u/substackcdn.com/image/fetch/$s_!IEvK!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c85de50-9931-410a-a160-dc5769755ffc_3544x2288.png 1272w, /__u/substackcdn.com/image/fetch/$s_!IEvK!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c85de50-9931-410a-a160-dc5769755ffc_3544x2288.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!IEvK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c85de50-9931-410a-a160-dc5769755ffc_3544x2288.png" width="1456" height="940" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4c85de50-9931-410a-a160-dc5769755ffc_3544x2288.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:940,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2317602,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!IEvK!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c85de50-9931-410a-a160-dc5769755ffc_3544x2288.png 424w, /__u/substackcdn.com/image/fetch/$s_!IEvK!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c85de50-9931-410a-a160-dc5769755ffc_3544x2288.png 848w, /__u/substackcdn.com/image/fetch/$s_!IEvK!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c85de50-9931-410a-a160-dc5769755ffc_3544x2288.png 1272w, /__u/substackcdn.com/image/fetch/$s_!IEvK!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4c85de50-9931-410a-a160-dc5769755ffc_3544x2288.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The default starting page of dbt docs provides very generic information. It can be considered as a placeholder, because it does not contain any information about your project. So it is better to change it to something more useful.</p><p>Create a file called <em>homepage.md</em> inside of <em>/models</em> folder with the following code:</p><pre><code><code>{% docs __overview__ %}

# My dbt project

This is a home page for my dbt project.

Link to [Github](&lt;https://github.com&gt;)
Link to [Jira](&lt;https://jira.com&gt;)

{% enddocs %}</code></code></pre><p>Inside of &#8220;docs __overview__&#8221; macro you can put any Markdown-like text that describes your project. This can include a general description of your project, useful links to other services, and any other onboarding materials.</p><h1>Hide non-useful content</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!K7uX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7da384-a65d-4b08-889f-1693f40ef9f7_3544x2288.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!K7uX!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7da384-a65d-4b08-889f-1693f40ef9f7_3544x2288.png 424w, /__u/substackcdn.com/image/fetch/$s_!K7uX!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7da384-a65d-4b08-889f-1693f40ef9f7_3544x2288.png 848w, /__u/substackcdn.com/image/fetch/$s_!K7uX!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7da384-a65d-4b08-889f-1693f40ef9f7_3544x2288.png 1272w, /__u/substackcdn.com/image/fetch/$s_!K7uX!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7da384-a65d-4b08-889f-1693f40ef9f7_3544x2288.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!K7uX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7da384-a65d-4b08-889f-1693f40ef9f7_3544x2288.png" width="1456" height="940" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe7da384-a65d-4b08-889f-1693f40ef9f7_3544x2288.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:940,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1032509,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!K7uX!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7da384-a65d-4b08-889f-1693f40ef9f7_3544x2288.png 424w, /__u/substackcdn.com/image/fetch/$s_!K7uX!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7da384-a65d-4b08-889f-1693f40ef9f7_3544x2288.png 848w, /__u/substackcdn.com/image/fetch/$s_!K7uX!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7da384-a65d-4b08-889f-1693f40ef9f7_3544x2288.png 1272w, /__u/substackcdn.com/image/fetch/$s_!K7uX!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe7da384-a65d-4b08-889f-1693f40ef9f7_3544x2288.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you have a fairly large dbt project, you may find that the data sources and projects in the sidebar look messy and are hard to navigate. It can be especially difficult for people who do not frequently view your documentation, such as managers.</p><p>To clear the clutter in the elements tree, you can hide unnecessary items. This includes all types of dbt resources (models, seeds, sources, etc.) and external packages:</p><pre><code><code>models:
  - name: stg_mysql__users
    docs:
      show: false</code></code></pre><p>Similarly, you can hide folders and packages in <em>dbt_project.yml</em>:</p><pre><code><code>models:
  my_dbt_project:
    staging: # Hide "staging" folder
      +docs:
        show: false
  
  dbt_utils: # Hide "dbt_utils" package
    +docs:
      show: false</code></code></pre><p>Hidden elements will not be visible in the rendered documentation, but will still be visible in the visual DAG (they will be marked as hidden).</p><h1>Use doc blocks to keep it DRY (Don't Repeat Yourself)</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!LzIT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0bc4673-933a-4092-8e1c-80d979523aa9_3544x2288.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!LzIT!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0bc4673-933a-4092-8e1c-80d979523aa9_3544x2288.png 424w, /__u/substackcdn.com/image/fetch/$s_!LzIT!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0bc4673-933a-4092-8e1c-80d979523aa9_3544x2288.png 848w, /__u/substackcdn.com/image/fetch/$s_!LzIT!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0bc4673-933a-4092-8e1c-80d979523aa9_3544x2288.png 1272w, /__u/substackcdn.com/image/fetch/$s_!LzIT!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0bc4673-933a-4092-8e1c-80d979523aa9_3544x2288.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!LzIT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0bc4673-933a-4092-8e1c-80d979523aa9_3544x2288.png" width="1456" height="940" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0bc4673-933a-4092-8e1c-80d979523aa9_3544x2288.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:940,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1266488,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!LzIT!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0bc4673-933a-4092-8e1c-80d979523aa9_3544x2288.png 424w, /__u/substackcdn.com/image/fetch/$s_!LzIT!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0bc4673-933a-4092-8e1c-80d979523aa9_3544x2288.png 848w, /__u/substackcdn.com/image/fetch/$s_!LzIT!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0bc4673-933a-4092-8e1c-80d979523aa9_3544x2288.png 1272w, /__u/substackcdn.com/image/fetch/$s_!LzIT!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0bc4673-933a-4092-8e1c-80d979523aa9_3544x2288.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One common problem with documentation is that it can become repetitive very quickly. For instance, the same column may be used in many downstream models, and copying and pasting its description can become tedious.</p><p>One solution is to use the <a href="https://hub.getdbt.com/dbt-labs/codegen/latest/">dbt_codegen</a> package. With the <em>generate_model_yaml</em> macro, you can generate a YAML schema for your models and pre-populate it with descriptions from upstream models, provided that identical columns exist and have a description:</p><pre><code><code>dbt run-operation generate_model_yaml --args '{"model_names": ["dim_customers"], "upstream_descriptions": True}'</code></code></pre><p>While the described solution is functional, it still has its flaws. If, for instance, you need to modify the definition of a column, you must search for all instances where the column is referenced. This violates the DRY (Don't Repeat Yourself) principle.</p><p>Better solution is to use <a href="https://docs.getdbt.com/reference/dbt-jinja-functions/doc">doc blocks</a>. They allow to write a documentation in Markdown files and then reference that documentation in YAML schemas. Create a markdown file <em>/models/docs.md</em> (you can choose any name) and create a doc block using Jinja like this:</p><pre><code><code>{% docs user_id %}

Unique identifier of a user in our system.
 
{% enddocs %}
</code></code></pre><p>Then simple use this block in a YAML schema:</p><pre><code><code>models:
  - name: dim_users
    columns:
      - name: user_id
        description: "{{ doc('user_id') }}"</code></code></pre><p>You can see here that the column description is not a hardcoded string, but rather a reference to a doc block called &#8220;user_id&#8221; using a built-in macro <em>doc()</em>. This approach enables you to define your documentation once, in one place, and then reuse it wherever needed.</p><h1>Color code nodes</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!8xZg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe929e9a4-7d97-4c31-bba8-8de70b256f4d_2782x1502.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!8xZg!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe929e9a4-7d97-4c31-bba8-8de70b256f4d_2782x1502.png 424w, /__u/substackcdn.com/image/fetch/$s_!8xZg!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe929e9a4-7d97-4c31-bba8-8de70b256f4d_2782x1502.png 848w, /__u/substackcdn.com/image/fetch/$s_!8xZg!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe929e9a4-7d97-4c31-bba8-8de70b256f4d_2782x1502.png 1272w, /__u/substackcdn.com/image/fetch/$s_!8xZg!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe929e9a4-7d97-4c31-bba8-8de70b256f4d_2782x1502.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!8xZg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe929e9a4-7d97-4c31-bba8-8de70b256f4d_2782x1502.png" width="1456" height="786" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e929e9a4-7d97-4c31-bba8-8de70b256f4d_2782x1502.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:786,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:437738,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!8xZg!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe929e9a4-7d97-4c31-bba8-8de70b256f4d_2782x1502.png 424w, /__u/substackcdn.com/image/fetch/$s_!8xZg!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe929e9a4-7d97-4c31-bba8-8de70b256f4d_2782x1502.png 848w, /__u/substackcdn.com/image/fetch/$s_!8xZg!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe929e9a4-7d97-4c31-bba8-8de70b256f4d_2782x1502.png 1272w, /__u/substackcdn.com/image/fetch/$s_!8xZg!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe929e9a4-7d97-4c31-bba8-8de70b256f4d_2782x1502.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Did you know that you can change the color of nodes in the visualization graph?</p><p>Now you do! &#128578;</p><p>You can change color for the whole folder of models, e.g. by defining it in <em>dbt_project.yml</em>:</p><pre><code><code>models:
  my_dbt_project:
    staging:
      +docs:
        node_color: "#e6b530"
</code></code></pre><p>Or even set it for each particular model, like so:</p><pre><code><code>{{
    config(
        docs={'node_color': '#682adb'}
    )
}}</code></code></pre><p>This will help you set your own color-coding for the DAG, making your documentation fancier, more informative, and pleasant to look at!</p><div><hr></div><p>That&#8217;s a wrap! I hope that you find those tips useful and will apply to your documentation to make it even better!</p><p><em><strong>If you liked this issue please subscribe and share it with your colleagues, this greatly helps me developing this newsletter!</strong></em></p><p>See you next time &#128075;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to #dbtips newsletter</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[How to Get the Most Out of dbt's Built-In Tests]]></title><description><![CDATA[Build superior tests using only built-in features]]></description><link>https://dbtips.substack.com/p/how-to-get-the-most-out-of-dbts-built</link><guid isPermaLink="false">https://dbtips.substack.com/p/how-to-get-the-most-out-of-dbts-built</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Fri, 01 Sep 2023 14:58:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Nahi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F754fdfec-e422-4293-8a9a-a27703edbecd_4088x2432.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Nahi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F754fdfec-e422-4293-8a9a-a27703edbecd_4088x2432.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Nahi!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F754fdfec-e422-4293-8a9a-a27703edbecd_4088x2432.png 424w, /__u/substackcdn.com/image/fetch/$s_!Nahi!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F754fdfec-e422-4293-8a9a-a27703edbecd_4088x2432.png 848w, /__u/substackcdn.com/image/fetch/$s_!Nahi!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F754fdfec-e422-4293-8a9a-a27703edbecd_4088x2432.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Nahi!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F754fdfec-e422-4293-8a9a-a27703edbecd_4088x2432.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Nahi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F754fdfec-e422-4293-8a9a-a27703edbecd_4088x2432.png" width="1456" height="866" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/754fdfec-e422-4293-8a9a-a27703edbecd_4088x2432.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:866,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:755023,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Nahi!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F754fdfec-e422-4293-8a9a-a27703edbecd_4088x2432.png 424w, /__u/substackcdn.com/image/fetch/$s_!Nahi!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F754fdfec-e422-4293-8a9a-a27703edbecd_4088x2432.png 848w, /__u/substackcdn.com/image/fetch/$s_!Nahi!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F754fdfec-e422-4293-8a9a-a27703edbecd_4088x2432.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Nahi!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F754fdfec-e422-4293-8a9a-a27703edbecd_4088x2432.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Out of the box, dbt Core provides several types of data tests that can be applied to your models. Data tests offer a simple way to check whether your data is complying with your expectations.</p><p>Built-in tests are a great opportunity to start testing your models. However, many analytics engineers are not aware that even default tests offer great flexibility and additional features that allow for very customized setups for each project.</p><p>Today, I want to share a couple of tips that could make dbt's built-in tests more powerful and useful.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>Tip 1: Use WHERE conditions in generic tests</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!x6Jd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c861600-3a32-4b19-bf94-1238ca5957b9_4424x2028.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!x6Jd!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c861600-3a32-4b19-bf94-1238ca5957b9_4424x2028.png 424w, /__u/substackcdn.com/image/fetch/$s_!x6Jd!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c861600-3a32-4b19-bf94-1238ca5957b9_4424x2028.png 848w, /__u/substackcdn.com/image/fetch/$s_!x6Jd!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c861600-3a32-4b19-bf94-1238ca5957b9_4424x2028.png 1272w, /__u/substackcdn.com/image/fetch/$s_!x6Jd!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c861600-3a32-4b19-bf94-1238ca5957b9_4424x2028.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!x6Jd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c861600-3a32-4b19-bf94-1238ca5957b9_4424x2028.png" width="1456" height="667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c861600-3a32-4b19-bf94-1238ca5957b9_4424x2028.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:667,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1019649,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!x6Jd!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c861600-3a32-4b19-bf94-1238ca5957b9_4424x2028.png 424w, /__u/substackcdn.com/image/fetch/$s_!x6Jd!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c861600-3a32-4b19-bf94-1238ca5957b9_4424x2028.png 848w, /__u/substackcdn.com/image/fetch/$s_!x6Jd!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c861600-3a32-4b19-bf94-1238ca5957b9_4424x2028.png 1272w, /__u/substackcdn.com/image/fetch/$s_!x6Jd!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c861600-3a32-4b19-bf94-1238ca5957b9_4424x2028.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When dbt tests your model, it scans the entire table for errors. In some cases, this may be necessary, such as when the table is small or when strict testing policies are required.</p><p>However, in many cases, it is unnecessary and you may want to test only specific rows or the most recent data. Additionally, performing a full scan of the table every day can result in high costs, so it may be beneficial to save some compute power and run time.</p><p>It is possible to <a href="https://docs.getdbt.com/reference/resource-configs/where">add WHERE clause</a> to generic by using a config block and <em>where</em> property:</p><pre><code><code>models:
  - name: dim_users
    columns:
      - name: user_id
        tests:
          - not_null:
            config:
              where: "created_at &gt;= current_date - interval '7 day'"</code></code></pre><p>The WHERE clause will be added to the testing SQL and executed.</p><h1>Tip 2: Adjust test severity and warning conditions</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!DeIy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fec1a8-92c3-4669-8966-5ef6512e2734_4424x1960.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!DeIy!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fec1a8-92c3-4669-8966-5ef6512e2734_4424x1960.png 424w, /__u/substackcdn.com/image/fetch/$s_!DeIy!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fec1a8-92c3-4669-8966-5ef6512e2734_4424x1960.png 848w, /__u/substackcdn.com/image/fetch/$s_!DeIy!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fec1a8-92c3-4669-8966-5ef6512e2734_4424x1960.png 1272w, /__u/substackcdn.com/image/fetch/$s_!DeIy!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fec1a8-92c3-4669-8966-5ef6512e2734_4424x1960.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!DeIy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fec1a8-92c3-4669-8966-5ef6512e2734_4424x1960.png" width="1456" height="645" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0fec1a8-92c3-4669-8966-5ef6512e2734_4424x1960.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:645,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:771557,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!DeIy!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fec1a8-92c3-4669-8966-5ef6512e2734_4424x1960.png 424w, /__u/substackcdn.com/image/fetch/$s_!DeIy!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fec1a8-92c3-4669-8966-5ef6512e2734_4424x1960.png 848w, /__u/substackcdn.com/image/fetch/$s_!DeIy!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fec1a8-92c3-4669-8966-5ef6512e2734_4424x1960.png 1272w, /__u/substackcdn.com/image/fetch/$s_!DeIy!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0fec1a8-92c3-4669-8966-5ef6512e2734_4424x1960.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Another thing you can do is to add <a href="https://docs.getdbt.com/reference/resource-configs/severity">test severity</a>. Some test failures may be hard errors, but others are just warnings. Warnings are unpleasant, but they can be safely skipped during pipeline execution, because they are not disrupting your models.</p><p>And here is another case. Imagine you have a table with millions of rows, and suppose one row contains an error. In this case, it would be better to mark the error as a warning, since its impact is minimal.</p><p>dbt allows you set a test severity as &#8220;warning&#8221; or set a threshold when the test is considered as error:</p><pre><code><code>tests:
  - not_null:
    config:
      severity: warn
        warn_if: "&gt;0"
        error_if: "&gt;100"</code></code></pre><p>In the example above, if a column has 1 or more missing values, dbt will consider it a warning. If the number of failures is greater than 100, then the test will throw an error.</p><h1>Tip 3: Custom generic tests</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!9P2T!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f9f753-a942-4740-92c4-a125a4477fb8_4424x2168.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!9P2T!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f9f753-a942-4740-92c4-a125a4477fb8_4424x2168.png 424w, /__u/substackcdn.com/image/fetch/$s_!9P2T!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f9f753-a942-4740-92c4-a125a4477fb8_4424x2168.png 848w, /__u/substackcdn.com/image/fetch/$s_!9P2T!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f9f753-a942-4740-92c4-a125a4477fb8_4424x2168.png 1272w, /__u/substackcdn.com/image/fetch/$s_!9P2T!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f9f753-a942-4740-92c4-a125a4477fb8_4424x2168.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!9P2T!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f9f753-a942-4740-92c4-a125a4477fb8_4424x2168.png" width="1456" height="714" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7f9f753-a942-4740-92c4-a125a4477fb8_4424x2168.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:714,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:762168,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!9P2T!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f9f753-a942-4740-92c4-a125a4477fb8_4424x2168.png 424w, /__u/substackcdn.com/image/fetch/$s_!9P2T!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f9f753-a942-4740-92c4-a125a4477fb8_4424x2168.png 848w, /__u/substackcdn.com/image/fetch/$s_!9P2T!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f9f753-a942-4740-92c4-a125a4477fb8_4424x2168.png 1272w, /__u/substackcdn.com/image/fetch/$s_!9P2T!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7f9f753-a942-4740-92c4-a125a4477fb8_4424x2168.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Default dbt project only provides you with 4 <a href="https://docs.getdbt.com/reference/resource-properties/tests#out-of-the-box-tests">generic tests</a>:</p><ul><li><p>not_null</p></li><li><p>unique</p></li><li><p>accepted_values</p></li><li><p>relationship</p></li></ul><p>You can easily create your own <a href="https://docs.getdbt.com/guides/best-practices/writing-custom-generic-tests">custom generic tests</a>. Custom generic tests should be stored in the <em>/tests/generic</em> folder, or in the <em>/macros</em> folder (although I prefer the former). The test should be a SELECT statement that returns failed records, wrapped in the <em>test</em> macro.</p><p>For example, let&#8217;s create a test that checks that a column contains only positive numbers:</p><pre><code><code>{% test is_positive(model, column_name) %}
    
    select *
    from {{ model }}
    where {{ column_name }} &lt; 0

{% endtest %}</code></code></pre><p>For generic tests, the first argument should always be called "model", as this identifies a resource from the project (e.g. model, data source, seed). The second argument may be optional (we will discuss why in the next tip).</p><p>Also, you can easily add more parameters and use them in the query:</p><pre><code><code>{% test is_within_range(model, column_name, from, to) %}

    select *
    from {{ model }}
    where {{ column_name }} not between {{ from }} and {{ to }}

{% endtest %}</code></code></pre><p>You can call such tests similarly to default generic tests:</p><pre><code><code>models:
  - name: orders
    columns:
      - name: price
        tests:
          - is_positive
          - is_within_range:
              from: 29
              to: 99</code></code></pre><p>Before implementing a custom generic test, it makes sense to check external packages like <a href="https://github.com/dbt-labs/dbt-utils">dbt_utils</a> or <a href="https://hub.getdbt.com/calogica/dbt_expectations/latest/">dbt_expectations</a>. There is a high chance that a similar test has already been implemented in one of these packages.</p><h1>Tip 4: Use generic tests on a model</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!_wh3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c3b4045-d53a-498d-8cd6-366f477623ca_4424x2040.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!_wh3!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c3b4045-d53a-498d-8cd6-366f477623ca_4424x2040.png 424w, /__u/substackcdn.com/image/fetch/$s_!_wh3!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c3b4045-d53a-498d-8cd6-366f477623ca_4424x2040.png 848w, /__u/substackcdn.com/image/fetch/$s_!_wh3!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c3b4045-d53a-498d-8cd6-366f477623ca_4424x2040.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_wh3!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c3b4045-d53a-498d-8cd6-366f477623ca_4424x2040.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!_wh3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c3b4045-d53a-498d-8cd6-366f477623ca_4424x2040.png" width="1456" height="671" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c3b4045-d53a-498d-8cd6-366f477623ca_4424x2040.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:671,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:718042,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!_wh3!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c3b4045-d53a-498d-8cd6-366f477623ca_4424x2040.png 424w, /__u/substackcdn.com/image/fetch/$s_!_wh3!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c3b4045-d53a-498d-8cd6-366f477623ca_4424x2040.png 848w, /__u/substackcdn.com/image/fetch/$s_!_wh3!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c3b4045-d53a-498d-8cd6-366f477623ca_4424x2040.png 1272w, /__u/substackcdn.com/image/fetch/$s_!_wh3!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c3b4045-d53a-498d-8cd6-366f477623ca_4424x2040.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In some cases, you may need to access several columns in the same test. One approach is to implement a singular test that will be specific to a particular model. However, another option is to use generic tests in a more intelligent way.</p><p>Let&#8217;s imagine an example where you want to test uniqueness of two columns. You could implement such test like this:</p><pre><code><code>models:
  - name: orders
    tests:
      - unique:
          column_name: "(order_id || '-' || user_id)"</code></code></pre><p>Here I moved unique test from column definition to the root of the model. Then, I used <em>column_name</em> parameter directly to provide concatenated columns of <em>order_id</em> and <em>user_id.</em></p><p>Do you remember when I mentioned in a previous tip that the <em>column_name</em> parameter can be optional in generic tests? Technically, you can completely skip it when applying a test to the whole model. But doing so can actually reduce flexibility, so pay attention.</p><p>Due to flexibility issues, it is generally recommended to use external packages for making tests truly generic. Here is the same implementation using the dbt_utils package:</p><pre><code><code>models:
  - name: orders
    tests:
      - dbt_utils.unique_combination_of_columns:
          combination_of_columns:
            - order_id
            - user_id</code></code></pre><h1>Tip 5: Try &#8220;dbt build&#8221; instead of &#8220;dbt run&#8221;</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!voOw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b11e54-53e4-4262-ad64-c251e4aa480b_4424x2040.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!voOw!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b11e54-53e4-4262-ad64-c251e4aa480b_4424x2040.png 424w, /__u/substackcdn.com/image/fetch/$s_!voOw!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b11e54-53e4-4262-ad64-c251e4aa480b_4424x2040.png 848w, /__u/substackcdn.com/image/fetch/$s_!voOw!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b11e54-53e4-4262-ad64-c251e4aa480b_4424x2040.png 1272w, /__u/substackcdn.com/image/fetch/$s_!voOw!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b11e54-53e4-4262-ad64-c251e4aa480b_4424x2040.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!voOw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b11e54-53e4-4262-ad64-c251e4aa480b_4424x2040.png" width="1456" height="671" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/74b11e54-53e4-4262-ad64-c251e4aa480b_4424x2040.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:671,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:635773,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!voOw!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b11e54-53e4-4262-ad64-c251e4aa480b_4424x2040.png 424w, /__u/substackcdn.com/image/fetch/$s_!voOw!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b11e54-53e4-4262-ad64-c251e4aa480b_4424x2040.png 848w, /__u/substackcdn.com/image/fetch/$s_!voOw!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b11e54-53e4-4262-ad64-c251e4aa480b_4424x2040.png 1272w, /__u/substackcdn.com/image/fetch/$s_!voOw!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F74b11e54-53e4-4262-ad64-c251e4aa480b_4424x2040.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One last tip for today is not specifically about tests, but rather about the process of testing and building models.</p><p>In some cases, I have seen people running dbt projects as a chain of two or more commands, like this:</p><pre><code><code>dbt run
dbt test</code></code></pre><p>What I don&#8217;t like in this approach is that quality issues in earlier models can migrate to final models.</p><p>For example, consider the case where staging model has some data quality issues, and descendant model inherits all those issues. We will know about problems with final model only after it is built and we run &#8220;test&#8221; command.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!7u_M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564b91b8-d6bd-42a5-9f3e-2209abaff025_3080x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!7u_M!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564b91b8-d6bd-42a5-9f3e-2209abaff025_3080x800.png 424w, /__u/substackcdn.com/image/fetch/$s_!7u_M!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564b91b8-d6bd-42a5-9f3e-2209abaff025_3080x800.png 848w, /__u/substackcdn.com/image/fetch/$s_!7u_M!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564b91b8-d6bd-42a5-9f3e-2209abaff025_3080x800.png 1272w, /__u/substackcdn.com/image/fetch/$s_!7u_M!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564b91b8-d6bd-42a5-9f3e-2209abaff025_3080x800.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!7u_M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564b91b8-d6bd-42a5-9f3e-2209abaff025_3080x800.png" width="1456" height="378" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/564b91b8-d6bd-42a5-9f3e-2209abaff025_3080x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:378,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:310065,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!7u_M!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564b91b8-d6bd-42a5-9f3e-2209abaff025_3080x800.png 424w, /__u/substackcdn.com/image/fetch/$s_!7u_M!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564b91b8-d6bd-42a5-9f3e-2209abaff025_3080x800.png 848w, /__u/substackcdn.com/image/fetch/$s_!7u_M!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564b91b8-d6bd-42a5-9f3e-2209abaff025_3080x800.png 1272w, /__u/substackcdn.com/image/fetch/$s_!7u_M!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F564b91b8-d6bd-42a5-9f3e-2209abaff025_3080x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A better way to run this code might be <em><a href="https://docs.getdbt.com/reference/commands/build">dbt build</a></em> command:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!GMzi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fc1b47e-b534-493b-abc2-be0e60f92295_3080x800.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!GMzi!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fc1b47e-b534-493b-abc2-be0e60f92295_3080x800.png 424w, /__u/substackcdn.com/image/fetch/$s_!GMzi!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fc1b47e-b534-493b-abc2-be0e60f92295_3080x800.png 848w, /__u/substackcdn.com/image/fetch/$s_!GMzi!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fc1b47e-b534-493b-abc2-be0e60f92295_3080x800.png 1272w, /__u/substackcdn.com/image/fetch/$s_!GMzi!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fc1b47e-b534-493b-abc2-be0e60f92295_3080x800.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!GMzi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fc1b47e-b534-493b-abc2-be0e60f92295_3080x800.png" width="1456" height="378" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9fc1b47e-b534-493b-abc2-be0e60f92295_3080x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:378,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:282335,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!GMzi!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fc1b47e-b534-493b-abc2-be0e60f92295_3080x800.png 424w, /__u/substackcdn.com/image/fetch/$s_!GMzi!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fc1b47e-b534-493b-abc2-be0e60f92295_3080x800.png 848w, /__u/substackcdn.com/image/fetch/$s_!GMzi!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fc1b47e-b534-493b-abc2-be0e60f92295_3080x800.png 1272w, /__u/substackcdn.com/image/fetch/$s_!GMzi!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9fc1b47e-b534-493b-abc2-be0e60f92295_3080x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The <em>build</em> command sequentially builds and immediately tests models one by one. If parent model fails the test, further dependent models will not be built, which means that bugs in earlier models will not affect the final models.</p><p>This of course leads to slightly outdated final models, but al least you won&#8217;t get questions from stakeholders about incorrect data on dashboards. Additionally, if this approach is combined with alerting (e.g. a message in Slack), you will be the first to know about any problems with the data.</p><p>Also, if severity level of a failed test is &#8220;warning&#8221;, the pipeline won&#8217;t be stopped and dbt will proceed to building further models. This might be convenient is some cases.</p><div><hr></div><p>That&#8217;s all for today!</p><p>Hopefully you learned a thing or two about using standard built-in dbt tests and will apply some of them in your project.</p><p><em><strong>If you liked this issue please subscribe and share it with your colleagues, this greatly helps me developing this newsletter!</strong></em></p><p>See you next time &#128075;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to #dbtips newsletter</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[Tips on starting new dbt project]]></title><description><![CDATA[How to make the coolest dbt project in the world]]></description><link>https://dbtips.substack.com/p/tips-on-starting-new-dbt-project</link><guid isPermaLink="false">https://dbtips.substack.com/p/tips-on-starting-new-dbt-project</guid><dc:creator><![CDATA[Oleg Agapov]]></dc:creator><pubDate>Thu, 24 Aug 2023 11:21:13 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!c_-2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55cf204e-ecf0-4660-83e2-bfb446277470_1198x628.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!c_-2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55cf204e-ecf0-4660-83e2-bfb446277470_1198x628.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!c_-2!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55cf204e-ecf0-4660-83e2-bfb446277470_1198x628.png 424w, /__u/substackcdn.com/image/fetch/$s_!c_-2!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55cf204e-ecf0-4660-83e2-bfb446277470_1198x628.png 848w, /__u/substackcdn.com/image/fetch/$s_!c_-2!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55cf204e-ecf0-4660-83e2-bfb446277470_1198x628.png 1272w, /__u/substackcdn.com/image/fetch/$s_!c_-2!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55cf204e-ecf0-4660-83e2-bfb446277470_1198x628.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!c_-2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55cf204e-ecf0-4660-83e2-bfb446277470_1198x628.png" width="1198" height="628" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55cf204e-ecf0-4660-83e2-bfb446277470_1198x628.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:628,&quot;width&quot;:1198,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:735980,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!c_-2!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55cf204e-ecf0-4660-83e2-bfb446277470_1198x628.png 424w, /__u/substackcdn.com/image/fetch/$s_!c_-2!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55cf204e-ecf0-4660-83e2-bfb446277470_1198x628.png 848w, /__u/substackcdn.com/image/fetch/$s_!c_-2!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55cf204e-ecf0-4660-83e2-bfb446277470_1198x628.png 1272w, /__u/substackcdn.com/image/fetch/$s_!c_-2!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55cf204e-ecf0-4660-83e2-bfb446277470_1198x628.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Exciting news! You have decided to use <a href="https://www.getdbt.com/">dbt</a> as your data modeling tool, and it's a great choice. dbt not only allows you to build excellent data models, but also provides additional functionalities such as data tests, documentation, and much more.</p><p>By design, dbt is meant to be flexible, giving you complete freedom to decide how to build your project. However, without proper planning, the project can quickly become a mess of unmaintainable code. It is therefore a good idea to establish some ground rules and set some conventions.</p><p>This post aims to provide a couple of tips that can make your project more scalable and maintainable in the long run.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading #dbtips! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h1>Tip 1: Define the project structure</h1><p>dbt is a very flexible tool that allows you to organize your project in a unique and customized way. However, this can lead to problems with scaling if it is not designed in an optimal and scalable way. Although dbt doesn't enforce a standard way of organizing models, they do suggest some best practices that you could use in your project.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!dp_8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d785600-3272-452a-996a-5a352c46ec9b_1366x644.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!dp_8!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d785600-3272-452a-996a-5a352c46ec9b_1366x644.png 424w, /__u/substackcdn.com/image/fetch/$s_!dp_8!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d785600-3272-452a-996a-5a352c46ec9b_1366x644.png 848w, /__u/substackcdn.com/image/fetch/$s_!dp_8!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d785600-3272-452a-996a-5a352c46ec9b_1366x644.png 1272w, /__u/substackcdn.com/image/fetch/$s_!dp_8!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d785600-3272-452a-996a-5a352c46ec9b_1366x644.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!dp_8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d785600-3272-452a-996a-5a352c46ec9b_1366x644.png" width="1366" height="644" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7d785600-3272-452a-996a-5a352c46ec9b_1366x644.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:644,&quot;width&quot;:1366,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:38007,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!dp_8!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d785600-3272-452a-996a-5a352c46ec9b_1366x644.png 424w, /__u/substackcdn.com/image/fetch/$s_!dp_8!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d785600-3272-452a-996a-5a352c46ec9b_1366x644.png 848w, /__u/substackcdn.com/image/fetch/$s_!dp_8!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d785600-3272-452a-996a-5a352c46ec9b_1366x644.png 1272w, /__u/substackcdn.com/image/fetch/$s_!dp_8!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d785600-3272-452a-996a-5a352c46ec9b_1366x644.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In the article "<a href="https://docs.getdbt.com/guides/best-practices/how-we-structure/1-guide-overview">How we structure our dbt projects</a>", dbt Labs recommends organizing all models into layers, with each layer serving a specific purpose and containing unique features. I refer to this approach as &#8220;modeling layers&#8221;, as it describes how to model data using layers.</p><p>There are three basic layers:</p><ul><li><p><strong>staging</strong> layer &#8212; describes your raw tables, with light transformations on top</p></li><li><p><strong>intermediate</strong> layer &#8212; where you start applying transformation and first business logic, these are modular and reusable blocks</p></li><li><p><strong>marts</strong> layer &#8212; contains models that will be exposed to end users and BI tools</p></li></ul><p>At first, this split on layers may sound redundant, but it really pays off in the long run. This approach brings many benefits to your project. Let's start with the separation of concerns: you'll know exactly how your models are organized, which leads to a clearer dependency graph. Next, you finally speaking the same language as your colleagues, which makes scaling a much easier process. It also speeds up the onboarding of new developers who are familiar with this practice.</p><p>Take your time and read the article I mentioned &#8212; you&#8217;ll find a lot of cool tips about project organization.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!clBh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F013b7125-dfc4-47de-bcaa-724f1e8c1cfb_1366x571.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!clBh!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F013b7125-dfc4-47de-bcaa-724f1e8c1cfb_1366x571.png 424w, /__u/substackcdn.com/image/fetch/$s_!clBh!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F013b7125-dfc4-47de-bcaa-724f1e8c1cfb_1366x571.png 848w, /__u/substackcdn.com/image/fetch/$s_!clBh!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F013b7125-dfc4-47de-bcaa-724f1e8c1cfb_1366x571.png 1272w, /__u/substackcdn.com/image/fetch/$s_!clBh!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F013b7125-dfc4-47de-bcaa-724f1e8c1cfb_1366x571.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!clBh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F013b7125-dfc4-47de-bcaa-724f1e8c1cfb_1366x571.png" width="1366" height="571" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/013b7125-dfc4-47de-bcaa-724f1e8c1cfb_1366x571.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:571,&quot;width&quot;:1366,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:38588,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!clBh!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F013b7125-dfc4-47de-bcaa-724f1e8c1cfb_1366x571.png 424w, /__u/substackcdn.com/image/fetch/$s_!clBh!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F013b7125-dfc4-47de-bcaa-724f1e8c1cfb_1366x571.png 848w, /__u/substackcdn.com/image/fetch/$s_!clBh!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F013b7125-dfc4-47de-bcaa-724f1e8c1cfb_1366x571.png 1272w, /__u/substackcdn.com/image/fetch/$s_!clBh!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F013b7125-dfc4-47de-bcaa-724f1e8c1cfb_1366x571.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Next, to ensure consistency and clarity, it is important to establish rules for model <strong>naming conventions</strong>. The previously mentioned article suggests a few naming rules for each layer. In general, it boils down to a few rules:</p><ul><li><p>don&#8217;t afraid of longer names, it&#8217;s better to make you models self-descriptive</p></li><li><p>use layer prefix, for example <em>stg_</em> for staging and <em>int_</em> for intermediates</p></li><li><p>staging models should include name of the data source and described entity</p></li><li><p>intermediate models should describe the transformation they are performing</p></li><li><p>marts models simply describe the entity they provide</p></li><li><p>sometimes marts are prefixed with <em>fct_</em> or <em>dim_</em> (facts and dimensions) to better describe what is inside</p></li><li><p>overall, you can (and sometimes should!) adjust these rules to better suite your needs</p></li><li><p>once rules are defined, stick to them!</p></li></ul><h1>Tip 2: Adjust default settings</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!NxPy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8772d2-b117-422f-b10a-2ce842807e2a_1110x634.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!NxPy!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8772d2-b117-422f-b10a-2ce842807e2a_1110x634.png 424w, /__u/substackcdn.com/image/fetch/$s_!NxPy!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8772d2-b117-422f-b10a-2ce842807e2a_1110x634.png 848w, /__u/substackcdn.com/image/fetch/$s_!NxPy!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8772d2-b117-422f-b10a-2ce842807e2a_1110x634.png 1272w, /__u/substackcdn.com/image/fetch/$s_!NxPy!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8772d2-b117-422f-b10a-2ce842807e2a_1110x634.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!NxPy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8772d2-b117-422f-b10a-2ce842807e2a_1110x634.png" width="1110" height="634" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f8772d2-b117-422f-b10a-2ce842807e2a_1110x634.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:634,&quot;width&quot;:1110,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:82663,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!NxPy!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8772d2-b117-422f-b10a-2ce842807e2a_1110x634.png 424w, /__u/substackcdn.com/image/fetch/$s_!NxPy!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8772d2-b117-422f-b10a-2ce842807e2a_1110x634.png 848w, /__u/substackcdn.com/image/fetch/$s_!NxPy!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8772d2-b117-422f-b10a-2ce842807e2a_1110x634.png 1272w, /__u/substackcdn.com/image/fetch/$s_!NxPy!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f8772d2-b117-422f-b10a-2ce842807e2a_1110x634.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When starting a new project, <em>dbt_project.yml</em> provides sensible default settings. However, these settings are too generic and may not reflect your particular situation.</p><p>Start with settings default schema and materialization type for all your assets.</p><p>For example, if you followed tip #1, you probably divided your models into different layers, which means that you can set defaults for each layer. Additionally, do the same exercise for seeds and snapshots if you want to keep them in a separate schema.</p><p>More settings you can <a href="https://docs.getdbt.com/reference/model-configs">check in the documentation</a>.</p><p>Next, you may want to alter the default behavior of how dbt handles database <a href="https://docs.getdbt.com/docs/build/custom-schemas">schemas</a>. By default, name of the custom schema gets <a href="https://docs.getdbt.com/docs/build/custom-schemas#understanding-custom-schemas">concatenated to the target schema</a>. If you want to change this behavior, just add a macro <em>generate_schema_name</em> that will override default functionality:</p><pre><code>{% macro generate_schema_name(custom_schema_name, node) -%}

    {%- set default_schema = target.schema -%}
    {%- if custom_schema_name is none -%}
        {{ default_schema }}
    {%- else -%}
        {{ default_schema }}_{{ custom_schema_name | trim }}
    {%- endif -%}

{%- endmacro %}</code></pre><h1>Tip 3: Limit data usage in development</h1><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!qZL2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c5ec0-aa02-4340-8a3a-f85fe0fe58a5_1088x206.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!qZL2!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c5ec0-aa02-4340-8a3a-f85fe0fe58a5_1088x206.png 424w, /__u/substackcdn.com/image/fetch/$s_!qZL2!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c5ec0-aa02-4340-8a3a-f85fe0fe58a5_1088x206.png 848w, /__u/substackcdn.com/image/fetch/$s_!qZL2!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c5ec0-aa02-4340-8a3a-f85fe0fe58a5_1088x206.png 1272w, /__u/substackcdn.com/image/fetch/$s_!qZL2!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c5ec0-aa02-4340-8a3a-f85fe0fe58a5_1088x206.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!qZL2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c5ec0-aa02-4340-8a3a-f85fe0fe58a5_1088x206.png" width="1088" height="206" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/587c5ec0-aa02-4340-8a3a-f85fe0fe58a5_1088x206.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:206,&quot;width&quot;:1088,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:19843,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!qZL2!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c5ec0-aa02-4340-8a3a-f85fe0fe58a5_1088x206.png 424w, /__u/substackcdn.com/image/fetch/$s_!qZL2!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c5ec0-aa02-4340-8a3a-f85fe0fe58a5_1088x206.png 848w, /__u/substackcdn.com/image/fetch/$s_!qZL2!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c5ec0-aa02-4340-8a3a-f85fe0fe58a5_1088x206.png 1272w, /__u/substackcdn.com/image/fetch/$s_!qZL2!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F587c5ec0-aa02-4340-8a3a-f85fe0fe58a5_1088x206.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>When working with large source tables, such as user events or website sessions, it can take a long time for your models to build. It could be fine for production, but not very pleasant during development. Fortunately, there is a trick that can help limit data usage during development, and it involves using a Jinja macro.</p><p>The easiest implementation is to add the following piece to your staging models:</p><pre><code>select *
from {{ source('mysql', 'user_events') }}

{% if target.name == 'dev' %}
where date(event_timestamp) &gt;= date_add(current_date(), interval -3 day)
{% endif %}</code></pre><p>This macro essentially checks the current environment and, if it is development environment, limits the data to the last three days. Alternatively, you could use variable to switch this manually whenever it is necessary like so:</p><pre><code>{% if var('is_dev', false) == true %}
where date(event_timestamp) &gt;= date_add(current_date(), interval -3 day)
{% endif %}</code></pre><p>So now if you run a simple &#8220;<em>dbt run</em>&#8221;, all rows will be processed, however if you set <em>is_dev</em> variable to true it will apply the limit:</p><pre><code>dbt run --vars '{is_dev: true}'</code></pre><h1>Tip 4: Add SQL linter</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!lU2K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d9f6362-6562-4861-81ae-34ba2cd234bf_1624x828.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!lU2K!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d9f6362-6562-4861-81ae-34ba2cd234bf_1624x828.png 424w, /__u/substackcdn.com/image/fetch/$s_!lU2K!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d9f6362-6562-4861-81ae-34ba2cd234bf_1624x828.png 848w, /__u/substackcdn.com/image/fetch/$s_!lU2K!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d9f6362-6562-4861-81ae-34ba2cd234bf_1624x828.png 1272w, /__u/substackcdn.com/image/fetch/$s_!lU2K!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d9f6362-6562-4861-81ae-34ba2cd234bf_1624x828.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!lU2K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d9f6362-6562-4861-81ae-34ba2cd234bf_1624x828.png" width="1456" height="742" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7d9f6362-6562-4861-81ae-34ba2cd234bf_1624x828.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:742,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:203721,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!lU2K!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d9f6362-6562-4861-81ae-34ba2cd234bf_1624x828.png 424w, /__u/substackcdn.com/image/fetch/$s_!lU2K!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d9f6362-6562-4861-81ae-34ba2cd234bf_1624x828.png 848w, /__u/substackcdn.com/image/fetch/$s_!lU2K!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d9f6362-6562-4861-81ae-34ba2cd234bf_1624x828.png 1272w, /__u/substackcdn.com/image/fetch/$s_!lU2K!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d9f6362-6562-4861-81ae-34ba2cd234bf_1624x828.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>If you are starting a dbt project in a team, this tip is a must: when working with several people on the same codebase, you will eventually encounter situations where your code style differs from others. In this case, you need to do two things: create a code style guide and implement a linter. For dbt projects, you specifically need an SQL linter.</p><p>Creating an SQL style guide is entirely up to you and your team. You need to mutually agree on the conventions and rules. You can borrow a few rules from <a href="https://github.com/dbt-labs/corp/blob/main/dbt_style_guide.md">dbt style guide</a>, <a href="https://about.gitlab.com/handbook/business-technology/data-team/platform/sql-style-guide/">Gitlab&#8217;s guide</a>, or any other set of rules out there. Simply make it your own and come to an agreement with your team.</p><p>For lining SQL code, I recommend using <a href="https://sqlfluff.com/">SQLFluff</a>, a Python library that checks your SQL code against a list of rules that can be customized. In some cases, it can even automatically fix issues, such as leading vs trailing commas and uppercase vs lowercase keywords. More importantly, there is a <a href="https://pypi.org/project/sqlfluff-templater-dbt/">plugin for dbt-styled</a> code.</p><p>Adding SQLFluff to your project is simple:</p><ol><li><p>Install the package along with the plugin:</p></li></ol><pre><code><code>pip install sqlfluff sqlfluff-templater-dbt</code></code></pre><ol start="2"><li><p>Create <em>.sqlfluff</em> file and configure <a href="https://docs.sqlfluff.com/en/stable/configuration.html#config">SQL rules</a> inside</p></li><li><p>Create <em>.sqlfluffignore</em> file with a list of folders that should be skipped during linting/fixing</p></li><li><p>Run linter with the command:</p></li></ol><pre><code><code>sqlfluff lint</code></code></pre><p>Additionally, check out this <a href="https://blog.devgenius.io/linting-sqls-with-dbt-and-sqlfluff-ceb45836a2ca">nice article</a> that provides more details and examples of SQLFluff.</p><h1>Tip 5: Use Github Actions as a scheduler</h1><p>When starting your dbt project, you have several options for triggering the pipeline. You could use dbt Cloud, an external scheduler like Apache Airflow or Dagster, or you could use Github Actions. The latter option is usually overlooked in favor of the first two, so let's discuss it.</p><p>Setting up Github Actions is a straightforward process. First, create a configuration file that includes the workflow and a cron schedule. Then, set the Data Warehouse credentials, and you can easily run periodic refreshes of your models.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="/__u/substackcdn.com/image/fetch/$s_!Xn1J!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb96bb02-417f-4d64-a0d0-049defa322b2_1080x1080.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="/__u/substackcdn.com/image/fetch/$s_!Xn1J!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb96bb02-417f-4d64-a0d0-049defa322b2_1080x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!Xn1J!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb96bb02-417f-4d64-a0d0-049defa322b2_1080x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!Xn1J!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb96bb02-417f-4d64-a0d0-049defa322b2_1080x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Xn1J!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_webp, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb96bb02-417f-4d64-a0d0-049defa322b2_1080x1080.png 1456w" sizes="100vw"><img src="/__u/substackcdn.com/image/fetch/$s_!Xn1J!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb96bb02-417f-4d64-a0d0-049defa322b2_1080x1080.png" width="1080" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cb96bb02-417f-4d64-a0d0-049defa322b2_1080x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:164639,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="/__u/substackcdn.com/image/fetch/$s_!Xn1J!, /__u/dbtips.substack.com/w_424, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb96bb02-417f-4d64-a0d0-049defa322b2_1080x1080.png 424w, /__u/substackcdn.com/image/fetch/$s_!Xn1J!, /__u/dbtips.substack.com/w_848, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb96bb02-417f-4d64-a0d0-049defa322b2_1080x1080.png 848w, /__u/substackcdn.com/image/fetch/$s_!Xn1J!, /__u/dbtips.substack.com/w_1272, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb96bb02-417f-4d64-a0d0-049defa322b2_1080x1080.png 1272w, /__u/substackcdn.com/image/fetch/$s_!Xn1J!, /__u/dbtips.substack.com/w_1456, /__u/dbtips.substack.com/c_limit, /__u/dbtips.substack.com/f_auto, /__u/dbtips.substack.com/q_auto:good, /__u/dbtips.substack.com/fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcb96bb02-417f-4d64-a0d0-049defa322b2_1080x1080.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Many <a href="https://twitter.com/matsonj/status/1693309930059735518">people</a> are using Github Actions for their projects to run dbt refreshes. If you search for "github actions dbt run" on Google, you will find numerous resources. Two great articles that explain how to create your own Github Actions workflow for running dbt refreshes can be found <a href="https://medium.com/re-data/scheduling-dbt-with-github-actions-pros-cons-d1ec2ef95da3">here</a> and <a href="https://www.datafold.com/blog/accelerating-dbt-core-ci-cd-with-github-actions-a-step-by-step-guide">here</a>.</p><p></p><div><hr></div><p>Thanks you for reading this post till the end!</p><p>I hope you found these tips useful and helpful for your dbt project. If you want to learn more about dbt and data modeling, please subscribe to this newsletter and stay tuned for more updates.</p><p>Happy modeling! &#128522;</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://dbtips.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Subscribe to #dbtips newsletter</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>