<?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[Not just SQL]]></title><description><![CDATA[A Data Engineer's Travel notes - not just SQL but also Cloud, Analytics and Python.]]></description><link>https://www.notjustsql.com</link><image><url>https://substackcdn.com/image/fetch/$s_!peEU!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a041bdd-f1c5-4faf-82cf-a9906c042412_1080x1080.png</url><title>Not just SQL</title><link>https://www.notjustsql.com</link></image><generator>Substack</generator><lastBuildDate>Fri, 01 May 2026 04:31:59 GMT</lastBuildDate><atom:link href="https://www.notjustsql.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Constantin Lungu]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[notjustsql@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[notjustsql@substack.com]]></itunes:email><itunes:name><![CDATA[Constantin Lungu]]></itunes:name></itunes:owner><itunes:author><![CDATA[Constantin Lungu]]></itunes:author><googleplay:owner><![CDATA[notjustsql@substack.com]]></googleplay:owner><googleplay:email><![CDATA[notjustsql@substack.com]]></googleplay:email><googleplay:author><![CDATA[Constantin Lungu]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Why you should think twice before UNNESTing arrays or date intervals]]></title><description><![CDATA[A practical reminder that not all simple solutions scale]]></description><link>https://www.notjustsql.com/p/why-you-should-think-twice-before</link><guid isPermaLink="false">https://www.notjustsql.com/p/why-you-should-think-twice-before</guid><dc:creator><![CDATA[Constantin Lungu]]></dc:creator><pubDate>Mon, 09 Jun 2025 20:50:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qfHQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1787c782-ebbb-49e0-b470-c70a989af036_2000x1500.heic" 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="https://substackcdn.com/image/fetch/$s_!qfHQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1787c782-ebbb-49e0-b470-c70a989af036_2000x1500.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qfHQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1787c782-ebbb-49e0-b470-c70a989af036_2000x1500.heic 424w, https://substackcdn.com/image/fetch/$s_!qfHQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1787c782-ebbb-49e0-b470-c70a989af036_2000x1500.heic 848w, https://substackcdn.com/image/fetch/$s_!qfHQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1787c782-ebbb-49e0-b470-c70a989af036_2000x1500.heic 1272w, https://substackcdn.com/image/fetch/$s_!qfHQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1787c782-ebbb-49e0-b470-c70a989af036_2000x1500.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qfHQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1787c782-ebbb-49e0-b470-c70a989af036_2000x1500.heic" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1787c782-ebbb-49e0-b470-c70a989af036_2000x1500.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:596225,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.notjustsql.com/i/165574938?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1787c782-ebbb-49e0-b470-c70a989af036_2000x1500.heic&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qfHQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1787c782-ebbb-49e0-b470-c70a989af036_2000x1500.heic 424w, https://substackcdn.com/image/fetch/$s_!qfHQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1787c782-ebbb-49e0-b470-c70a989af036_2000x1500.heic 848w, https://substackcdn.com/image/fetch/$s_!qfHQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1787c782-ebbb-49e0-b470-c70a989af036_2000x1500.heic 1272w, https://substackcdn.com/image/fetch/$s_!qfHQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1787c782-ebbb-49e0-b470-c70a989af036_2000x1500.heic 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 role="img" 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><title></title><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">Macin Mountains, Romania</figcaption></figure></div><p>If you ever work with terabyte-scale data, try to avoid unnecessary unnesting/unpacking arrays and date ranges. If you have no choice, materialize the unnested result and partition and cluster it accordingly in preparation for any further joins.</p><p>With that bold statement out there, here&#8217;s a BigQuery lesson drawn from real-world experience.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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 Not just SQL! 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>Imagine an SCD-2 table with tens of millions of rows containing product data.</p><p>For particular subintervals (even individual days) of the [valid_from, valid_to) period, we need to set some attributes (think: marking that the product is on sale, or is getting ready to be discontinued).</p><p>The simple and straightforward solution here would be to unpack the intervals with something like UNNEST(GENERATE_DATE_ARRAY(valid_from, valid_to)). Joining with a date dimension would work in a similar fashion.</p><p>This means that it is easy to now look up these attributes at (grain + valid_date).</p><p>But now we could be talking about several billion rows. Which you might join with other big tables.</p><p>The issues with this approach are quite obvious. Say we have a two-year interval. Unpacking this period would mean having 730 rows instead of one, while a majority of them would just be repeated data &#8212; there&#8217;s no actual change, just some spot changes for individual days or subintervals.</p><p>We can of course go ahead and compact this data back using an algorithm like the one I presented <a href="https://datawise.dev/compacting-date-intervals-in-bigquery">in one of my previous posts</a>, but regardless of whether we do that or not, the whole processing would be incredibly expensive and inefficient. </p><p>So, is there a solution here? Sometimes there might be.</p><p>Say for the two-year interval [2021-01-01, 2023-01-01], we&#8217;d need to mark the subperiod [2021-04-15, 2021-05-15] as the period when the product is on sale.</p><p>This data can be accurately expressed as the following intervals:</p><p>[2021-01-01 &#8594; 2021-04-15),</p><p>[2021-04-15 &#8594; 2021-05-15),</p><p>[2021-05-15 &#8594; 2023-01-01).</p><p>So in fact, we&#8217;re splitting the intervals into smaller subintervals based on what was true at each moment. Instead of unpacking and getting hundreds of records, we need only 3. I&#8217;ve illustrated this approach <a href="https://datawise.dev/practical-bigquery-joining-temporal-tables">in another previous post</a>.</p><p>Such a difference in cardinality has deep performance implications, allowing us to process data way more efficiently.</p><p>While this might be an unusual corner case, my initial opinion stands &#8212; if you can get away without UNNESTing your array or unpacking a date interval, you&#8217;ll manage to keep cardinality in check and save a lot of processing power.</p><p>If there&#8217;s no way around it for your particular case, at the very least, materialize the result (I know, it&#8217;s going to be a lot of storage) and tailor the partitioning and clustering according to the querying (especially joining with other big+ tables) downstream.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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 Not just SQL! 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>]]></content:encoded></item><item><title><![CDATA[For quality work, understand your data grain first]]></title><description><![CDATA[There&#8217;s one concept that is central when working with data and goes beyond specific technology or #SQL dialects.]]></description><link>https://www.notjustsql.com/p/for-quality-work-understand-your</link><guid isPermaLink="false">https://www.notjustsql.com/p/for-quality-work-understand-your</guid><dc:creator><![CDATA[Constantin Lungu]]></dc:creator><pubDate>Fri, 01 Nov 2024 15:29:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!njfX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c7ba22-58dc-4313-b330-4e4606392ae0_1569x937.heic" 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="https://substackcdn.com/image/fetch/$s_!njfX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c7ba22-58dc-4313-b330-4e4606392ae0_1569x937.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!njfX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c7ba22-58dc-4313-b330-4e4606392ae0_1569x937.heic 424w, https://substackcdn.com/image/fetch/$s_!njfX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c7ba22-58dc-4313-b330-4e4606392ae0_1569x937.heic 848w, https://substackcdn.com/image/fetch/$s_!njfX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c7ba22-58dc-4313-b330-4e4606392ae0_1569x937.heic 1272w, https://substackcdn.com/image/fetch/$s_!njfX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c7ba22-58dc-4313-b330-4e4606392ae0_1569x937.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!njfX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c7ba22-58dc-4313-b330-4e4606392ae0_1569x937.heic" width="1456" height="870" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32c7ba22-58dc-4313-b330-4e4606392ae0_1569x937.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:870,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:133635,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&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="https://substackcdn.com/image/fetch/$s_!njfX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c7ba22-58dc-4313-b330-4e4606392ae0_1569x937.heic 424w, https://substackcdn.com/image/fetch/$s_!njfX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c7ba22-58dc-4313-b330-4e4606392ae0_1569x937.heic 848w, https://substackcdn.com/image/fetch/$s_!njfX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c7ba22-58dc-4313-b330-4e4606392ae0_1569x937.heic 1272w, https://substackcdn.com/image/fetch/$s_!njfX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32c7ba22-58dc-4313-b330-4e4606392ae0_1569x937.heic 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 role="img" 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><title></title><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&#8217;s one concept that is central when working with data and goes beyond specific technology or <strong>#SQL</strong> dialects. You just can&#8217;t miss it. I&#8217;m talking about the grain&#8212;the granularity of the data.</p><p>It&#8217;s essentially answering the question: what does one row of this data represent? Is it an order, a line item in an order, or a status update for a line item?</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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 Not just SQL! 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>This is so important because you need to know it to query and ETL data correctly. If not, you&#8217;ll end up guessing, and might never be 100% sure you made the right choice. Misunderstanding the grain of a table is how you get faulty joins and duplicates&#8212;and why DISTINCT is often slapped on indiscriminately to try and fix the problem.</p><p>You need to understand the grain to know whether you should COUNT or COUNT DISTINCT, and whether it&#8217;s safe to SUM or JOIN data.</p><p>Now, if you&#8217;ve ever tried to figure out the grain of an external data source with no documentation, you know it can get tricky. Here&#8217;s my approach:</p><p>&#10145;&#65039;&nbsp;Of course, find out who maintains the data, get your answers, and give feedback on any issues you find. Then ask for documentation or, in extremis, write down your findings. The next person will thank you!</p><p>&#10145;&#65039; If that doesn&#8217;t work, start with assumptions based on the columns but test to validate or invalidate what you think is true.</p><p>&#10145;&#65039; Iterate fast.</p><p>&#10145;&#65039; If you see DISTINCT on anything with more than a couple of columns, run the other way, catch your breath, and return to replace them a methodical approach to duplication.</p><p>&#10145;&#65039; Leverage ranking functions like ROW_NUMBER() and DENSE_RANK().</p><p>&#10145;&#65039; Use COUNT(1) and GROUP BY to test your hypothesis.</p><p>&#10145;&#65039; ????</p><p>&#10145;&#65039; PROFIT.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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 Not just SQL! 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>]]></content:encoded></item><item><title><![CDATA[How I View Real-Life Data Collection as a Data Professional]]></title><description><![CDATA[I Went Shopping as a Data Engineer: Here's What I Observed]]></description><link>https://www.notjustsql.com/p/how-i-view-real-life-data-collection</link><guid isPermaLink="false">https://www.notjustsql.com/p/how-i-view-real-life-data-collection</guid><dc:creator><![CDATA[Constantin Lungu]]></dc:creator><pubDate>Sun, 04 Aug 2024 10:36:59 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!beX2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ddbe86-d4df-4c5e-b098-5a8401f4aa04_1600x1200.heic" 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="https://substackcdn.com/image/fetch/$s_!beX2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ddbe86-d4df-4c5e-b098-5a8401f4aa04_1600x1200.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!beX2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ddbe86-d4df-4c5e-b098-5a8401f4aa04_1600x1200.heic 424w, https://substackcdn.com/image/fetch/$s_!beX2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ddbe86-d4df-4c5e-b098-5a8401f4aa04_1600x1200.heic 848w, https://substackcdn.com/image/fetch/$s_!beX2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ddbe86-d4df-4c5e-b098-5a8401f4aa04_1600x1200.heic 1272w, https://substackcdn.com/image/fetch/$s_!beX2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ddbe86-d4df-4c5e-b098-5a8401f4aa04_1600x1200.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!beX2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ddbe86-d4df-4c5e-b098-5a8401f4aa04_1600x1200.heic" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41ddbe86-d4df-4c5e-b098-5a8401f4aa04_1600x1200.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:296372,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&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="https://substackcdn.com/image/fetch/$s_!beX2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ddbe86-d4df-4c5e-b098-5a8401f4aa04_1600x1200.heic 424w, https://substackcdn.com/image/fetch/$s_!beX2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ddbe86-d4df-4c5e-b098-5a8401f4aa04_1600x1200.heic 848w, https://substackcdn.com/image/fetch/$s_!beX2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ddbe86-d4df-4c5e-b098-5a8401f4aa04_1600x1200.heic 1272w, https://substackcdn.com/image/fetch/$s_!beX2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41ddbe86-d4df-4c5e-b098-5a8401f4aa04_1600x1200.heic 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 role="img" 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><title></title><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">Chania Venetian Harbor, Crete, Greece</figcaption></figure></div><p>I find that working with data daily significantly influences how you perceive the world around you. You begin to notice patterns and details you might otherwise overlook.</p><p>Take retail, for example.</p><p>In our places, it's common for pharmacies, gas stations, and supermarket chains to offer loyalty cards. Some of these programs are worthwhile, while others are not. Personally, I'm wary of them for privacy reasons.</p><p>From an outside viewer like me, their goal lies on the surface: boosting customer loyalty and collecting user data. But why is this data collected? Spending habits, products frequently bought together, evolution of demand patterns - for retailers, this information is a gold mine.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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="https://www.notjustsql.com/subscribe?"><span>Subscribe now</span></a></p><p>But what's even more interesting is the data collection process. In some places, clerks will scan their own loyalty cards for customers who don't have one, accumulating points for themselves. That's a huge outlier raking tens and hundreds of transactions in a day. Filter that one out?</p><p>Some people even have multiple loyalty cards for the same store, especially when no form is required to get one&#8212;they just hand you a new card. How do you accurately identify a unique buyer in this case?</p><p>In other cases, an entire family might use the same loyalty card. Just imagine the variety of consumer patterns for that one.</p><p>The data teams working with such information must have fascinating day-to-day tasks, involving elaborate data cleaning and processing setups.</p><p>Whenever I see the events being collected in real life, I'm already thinking about someone analyzing them with SQL somewhere.</p><p>So, as a Data Analyst, Data Engineer, or Data Scientist, it might be beneficial to consider how the data was collected the next time you work on a data task.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.com/p/how-i-view-real-life-data-collection?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thank you for reading Not just SQL. This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.com/p/how-i-view-real-life-data-collection?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.notjustsql.com/p/how-i-view-real-life-data-collection?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item><item><title><![CDATA[Short, almost non-technical guide to SQL query tuning as a Data Engineer]]></title><description><![CDATA[It's not all about those fancy details.]]></description><link>https://www.notjustsql.com/p/short-almost-non-technical-guide</link><guid isPermaLink="false">https://www.notjustsql.com/p/short-almost-non-technical-guide</guid><dc:creator><![CDATA[Constantin Lungu]]></dc:creator><pubDate>Wed, 19 Jun 2024 14:07:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a041bdd-f1c5-4faf-82cf-a9906c042412_1080x1080.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="https://images.unsplash.com/photo-1582043568773-a7a2b57239f5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxjb2dzfGVufDB8fHx8MTcxODgwNDg4MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1582043568773-a7a2b57239f5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxjb2dzfGVufDB8fHx8MTcxODgwNDg4MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1582043568773-a7a2b57239f5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxjb2dzfGVufDB8fHx8MTcxODgwNDg4MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1582043568773-a7a2b57239f5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxjb2dzfGVufDB8fHx8MTcxODgwNDg4MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1582043568773-a7a2b57239f5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxjb2dzfGVufDB8fHx8MTcxODgwNDg4MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1582043568773-a7a2b57239f5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxjb2dzfGVufDB8fHx8MTcxODgwNDg4MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="6000" height="4000" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1582043568773-a7a2b57239f5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxjb2dzfGVufDB8fHx8MTcxODgwNDg4MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:4000,&quot;width&quot;:6000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;gold and black leather textile&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&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="gold and black leather textile" title="gold and black leather textile" srcset="https://images.unsplash.com/photo-1582043568773-a7a2b57239f5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxjb2dzfGVufDB8fHx8MTcxODgwNDg4MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1582043568773-a7a2b57239f5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxjb2dzfGVufDB8fHx8MTcxODgwNDg4MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1582043568773-a7a2b57239f5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxjb2dzfGVufDB8fHx8MTcxODgwNDg4MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1582043568773-a7a2b57239f5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwyfHxjb2dzfGVufDB8fHx8MTcxODgwNDg4MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 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 role="img" 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><title></title><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">Photo by <a href="true">Josh Redd</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>So I spend quite a bit of time optimizing SQL data processing pipelines in BigQuery. Scale-wise, I might have an occasional encounter with a 10TB table. I have limited knowledge on what it does 'under the hood', but I find that there's a couple of simple, common sense things you can do from the start.</p><p>So here's my thinking when I'm trying to optimize such a problematic query.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.com/p/short-almost-non-technical-guide?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thank you for reading Not just SQL. This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.com/p/short-almost-non-technical-guide?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.notjustsql.com/p/short-almost-non-technical-guide?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><h1>Work with less</h1><p>The simplest and most efficient optimization is to work with less data from the beginning. Perhaps you don't need that much data for the task you're performing.</p><p>Say you're processing month-over-month calculations. Do you really need that 3-year old data processed in this query? If not, filter those rows out.</p><p>How about the columns? Do you really need those? Keep only what you need.</p><h1>Do less work</h1><p>Another big trick is to ensure there is less work do be done. So, can you rewrite the problem you're solving in a way that makes it easier to find the answer (even for you as a human with a pen &amp; paper / Excel )?</p><p>For example, I'd always try to limit the number of column I aggregate by, keeping only the essential. I wouldn't need the customer's country and city when aggregating their transactions, I can always look up that later.</p><p>Or take Window Functions. They take quite a toll on the performance at these high volumes. So I would use them sparingly. Check out <a href="https://datawise.dev/practical-bigquery-filling-in-missing-data">this example</a> of how I've replaced multiple WINDOW function calls with just a single one + PIVOT.</p><p>Also, aim to reduce the number of rows that you are working with as early as possible - that is, push aggregation as early as possible.</p><h1>Is there any repetitive work involved?</h1><p>Is there any part of the processing that you see is done multiple times? It doesn't need to be identical, but can you find a way to make the computation happen just once? Can you re-purpose a staging table to to serve multiple needs at the same time?</p><p>In a more practical fashion, a normal (non-recursive) CTE in BigQuery is evaluated once per each each call, so you're effectively doing that work over and over again.</p><h1>Can you split things up?</h1><p>When combining multiple big tables and are doing a lot of operations on this data, things are bound to get ugly.</p><p>One way to work around that is to split the process into logical steps and components.</p><p>Extract big steps into a separate staging table that is as barebones as possible but is properly partitioned and clustered (on indexed, depending on your platform).</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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 Not just SQL! 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>Is there any underlying problem making the data that big?</h1><p>I&#8217;ve recently was struggling with optimizing something that produced a 17TB table, only to realise that the data sources are nowhere that big - and a bad join made the data volume to explode.</p><p>So maybe performance is not your main problem to fix? </p><h1>Check for yourself</h1><p>Pick a representative data slice. Turn off query caching in your window. Try out different approaches and work out which one is the best.</p><p>Check for different data volumes. Do you findings till hold? As learned multiple times on my own skin, test your assumptions and pick a best approach based on empirical results.</p><h1>Think about maintainability</h1><p>While this is second-to-last, it should rank closer to the top in terms of importance. Is whatever you&#8217;ve achieved there understood by your peers in the team, or whoever might come to replace you? Will they be able to maintain, extend or fix your solution should the conditions change?</p><p>No one likes black boxes, so make sure to do document the &#8216;what&#8217; and &#8216;why&#8217; of your work, ensuring your actions have a positive net impact on the process in its lifetime. </p><h1>In lieu of a conclusion: invest your time wisely</h1><p>Trying to optimize something can be interesting. Time will fly by. Don't get yourself sucked in and keep an eye on the end target. Is all this effort on optimization worth it? Don't spent days of working to save 5$ in processing costs.</p><p>Perhaps you should prioritize improving a scheduled query running every 2 hours than a vastly bigger one that is used for yearly reporting?</p><p>After all, the smaller one runs 12 * 365 = 4380 times a year, so a small saving here might mean a big difference in the grand scheme of things.</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.com/p/short-almost-non-technical-guide/comments&quot;,&quot;text&quot;:&quot;Leave a comment&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.notjustsql.com/p/short-almost-non-technical-guide/comments"><span>Leave a comment</span></a></p>]]></content:encoded></item><item><title><![CDATA[Easy with that SELECT DISTINCT!]]></title><description><![CDATA[Quick fix, possible long-term trouble]]></description><link>https://www.notjustsql.com/p/easy-with-that-select-distinct</link><guid isPermaLink="false">https://www.notjustsql.com/p/easy-with-that-select-distinct</guid><dc:creator><![CDATA[Constantin Lungu]]></dc:creator><pubDate>Sun, 02 Jun 2024 14:09:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!0oSS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7103e827-8190-4d6b-bec2-81dda8acab9e_546x457.jpeg" 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="https://substackcdn.com/image/fetch/$s_!0oSS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7103e827-8190-4d6b-bec2-81dda8acab9e_546x457.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0oSS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7103e827-8190-4d6b-bec2-81dda8acab9e_546x457.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0oSS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7103e827-8190-4d6b-bec2-81dda8acab9e_546x457.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0oSS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7103e827-8190-4d6b-bec2-81dda8acab9e_546x457.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0oSS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7103e827-8190-4d6b-bec2-81dda8acab9e_546x457.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0oSS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7103e827-8190-4d6b-bec2-81dda8acab9e_546x457.jpeg" width="546" height="457" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7103e827-8190-4d6b-bec2-81dda8acab9e_546x457.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:457,&quot;width&quot;:546,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79203,&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;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0oSS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7103e827-8190-4d6b-bec2-81dda8acab9e_546x457.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0oSS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7103e827-8190-4d6b-bec2-81dda8acab9e_546x457.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0oSS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7103e827-8190-4d6b-bec2-81dda8acab9e_546x457.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0oSS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7103e827-8190-4d6b-bec2-81dda8acab9e_546x457.jpeg 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 role="img" 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><title></title><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>So you have to write a SQL query and after tirelessly working on it, you get more rows than you expected. It looks otherwise correct, but some of the records you see multiple times.</p><p>Now, while the temptation to just slap a DISTINCT in that final SELECT is enormous, don't succumb to it (yes I wrote this word).</p><p>Indiscriminate usage of DISTINCT might cover up a few problems with your query or can even come back to bite you.</p><h3>1. Bad join</h3><p>It could be that one of your joins is incorrect or you might need, for example, an extra condition there.</p><p>Or you've unwillingly created a self-join like a.id = a.id &#128513; Been there, done that.</p><h3>2. Incorrect grain</h3><p>One of the tables you've retrieved data from has a finer granularity that you think, for example, multiple product variants that share the same id instead of just one product id per row.</p><p>Or you're getting multiple status updates throughout the lifetime of an order. Do you need to pick only one of these multiple rows, say the last status update?</p><p>Or you're trying to join month-level and day-level attributes together.</p><p>Do you need to aggregate or split one of the inputs to match the others?</p><h3>3. Are you working with nested data?</h3><p>If you're working with nested data and proceed to unpack it i.e. UNNEST an ARRAY in BigQuery, you'll get the non-nested column repeated multiple times. Ensure you&#8217;re correctly processing the nested data as per your requirements.</p><h3>What should I do? How can I debug a problem with duplicates?</h3><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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 Not just SQL! 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><ul><li><p>Pick a subset of data that you can simply analyze at a glance: a day, a single store, a product or one single order.</p></li><li><p>Filter the data for just that. Are you getting the expected amount or rows? Is the granularity what you expected?</p></li><li><p>Have a look at each table individually that you are using in your query.</p></li><li><p>If you know an exact number of rows you should be seeing as output (e.g. total number of orders) you could comment out all the columns and put a SELECT COUNT(1) instead. Comment out the joined tables and add them back one by one. At what point in time does the COUNT result change for the worse?</p><p></p></li></ul><p>If you still need to de-duplicate, say because the data is bad at the source (and you know it for a fact) or you receive multiple status updates but only want the last one - do so in an explicit manner, clearly showing how you are doing it and ideally explain in a short comment why you are doing it.</p><p>This could look like the following:</p><pre><code>QUALIFY ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY status_update_ts DESC)=1</code></pre><p>If you're not familiar with QUALIFY and other ways to de-duplicate, check out the comprehensive <a href="https://medium.com/google-cloud/deduplication-in-bigquery-tables-a-comparative-study-of-7-approaches-f48966eeea2b">Medium article</a> about the many ways you can de-duplicate and their pros &amp; cons.</p><p>Happy querying!</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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 Not just SQL! 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>]]></content:encoded></item><item><title><![CDATA[Breaking Free from Tutorial Hell: Tips for Aspiring Data Professionals ]]></title><description><![CDATA[Stop collecting certificates and start working on your skills]]></description><link>https://www.notjustsql.com/p/breaking-free-from-tutorial-hell</link><guid isPermaLink="false">https://www.notjustsql.com/p/breaking-free-from-tutorial-hell</guid><dc:creator><![CDATA[Constantin Lungu]]></dc:creator><pubDate>Sat, 01 Jun 2024 15:14:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_5G1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde06056e-5c5b-4b0f-8716-c45bde5b64e8_2048x1536.jpeg" 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="https://substackcdn.com/image/fetch/$s_!_5G1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde06056e-5c5b-4b0f-8716-c45bde5b64e8_2048x1536.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_5G1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde06056e-5c5b-4b0f-8716-c45bde5b64e8_2048x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_5G1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde06056e-5c5b-4b0f-8716-c45bde5b64e8_2048x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_5G1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde06056e-5c5b-4b0f-8716-c45bde5b64e8_2048x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_5G1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde06056e-5c5b-4b0f-8716-c45bde5b64e8_2048x1536.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_5G1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde06056e-5c5b-4b0f-8716-c45bde5b64e8_2048x1536.jpeg" width="1456" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de06056e-5c5b-4b0f-8716-c45bde5b64e8_2048x1536.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:605517,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&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="" title="" srcset="https://substackcdn.com/image/fetch/$s_!_5G1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde06056e-5c5b-4b0f-8716-c45bde5b64e8_2048x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!_5G1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde06056e-5c5b-4b0f-8716-c45bde5b64e8_2048x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!_5G1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde06056e-5c5b-4b0f-8716-c45bde5b64e8_2048x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!_5G1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde06056e-5c5b-4b0f-8716-c45bde5b64e8_2048x1536.jpeg 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 role="img" 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><title></title><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">M&#259;cin Mountains (SE Romania)</figcaption></figure></div><p>Starting your journey in Analytics can feel like standing at the base of a big mountain. I&#8217;ve seen it around me, and I&#8217;ve experienced it myself: there&#8217;s an overwhelming amount of information and an endless list of courses and tutorials you can take.</p><p>As a Finance undergraduate transitioning into Analytics, I was confused about where to start learning. I signed up for every platform I could find &#8211; Coursera, Team Treehouse, Pluralsight, Linux Academy, Cloud Guru, you name it. At first, I learned a lot of things, picked up the basics on Python, brushed up my SQL, learned about what git was. But then, as I was going through them, it felt increasingly like the goal was collecting the certificates at the end, not the journey itself.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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 Not just SQL! 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><strong>Don't Fall into the Trap</strong></h3><p>It's easy to fall into the trap of this "tutorial hell" &#8211; a cycle where you keep consuming courses without ever applying what you've learned. Sure, I&#8217;d want a course to learn the basics of Python or how a Data Engineering stack on GCP looks like, but don&#8217;t overdo it. Practice &gt; theory.</p><p>Let&#8217;s see on how to avoid this common pitfall and make the most of your learning journey.</p><h3><strong>Start with the Basics</strong></h3><p>Surely being good with Spark or ${YOUR_COOL_NEW_TOOL} is good and commands a bigger salary, but you still need to have your basics right first. A solid foundation in SQL, a decent grasp of Python, a basic understanding of data modeling, working knowledge of git, and minimal familiarity with products in one big cloud Analytics stack - these could be a good foundation when starting your career.</p><h3><strong>Choose Wisely</strong></h3><p>Your time and money are limited resources, so start by picking a good course for your topic. Index the information in your mind: understand the features of the tools or frameworks and use cases where they are suitable. Focus on grasping the bigger picture rather than memorizing specifics. You can always look up those later. Nobody wants you to know the exact order of arguments for a specific function; you just need to remember it exists and it can help in X or Y situation.</p><h3><strong>Get Hands-On Quickly</strong></h3><p>One of your primary goals should be to learn the basics and then start applying them as soon as possible. There will always be gaps in your knowledge, but it's better to dive in and start doing rather than endlessly chasing another tutorial. Applying your skills quickly helps cement your understanding and builds your confidence.</p><h3><strong>Course Certificates Don&#8217;t Do Much</strong></h3><p>If you&#8217;re looking for your first job or internship, having a lot of certificates from courses might be a small advantage to your name, signaling your motivation to learn, your perseverance, and consistency. But nowadays I&#8217;m not even sure that it would matter in how modern CV screening works and with this strong competition.</p><h3><strong>Work on Personal Projects in the Long Term</strong></h3><p>Make it a habit to engage in personal projects or guided projects that simulate real-life scenarios.</p><p>These are good:</p><ul><li><p>For your understanding - you encounter problems that tutorials don&#8217;t cover and fix them</p></li><li><p>For your confidence - you manage to make things work on your own, so you&#8217;ll be just fine in a job setting</p></li><li><p>For your employability - it&#8217;s not only about the keyword in your resume, it&#8217;s also about being a problem solver and finding solutions to problems, business or technical</p></li></ul><p>I&#8217;ve previously posted about how personal projects can help you grow as a developer:</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;1c593746-38e4-4d8b-80f6-b8530bdddd26&quot;,&quot;caption&quot;:&quot;Ever wondered how to deepen your understanding of programming and bridge the gap between theoretical knowledge and real-world application? Consider starting a pet project! Story time Several years ago I was working in a Business Intelligence specialist role, transitioning from previously working with Excel only as a freshly &#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;How a pet project can supercharge your developer career&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:40700774,&quot;name&quot;:&quot;Constantin Lungu&quot;,&quot;bio&quot;:&quot;Data Engineer by day. And by night.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/823b83a1-0073-4bba-a314-65780e191efa_324x334.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-08-15T14:22:00.000Z&quot;,&quot;cover_image&quot;:&quot;https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxzdHVkeSUyMGxhcHRvcHxlbnwwfHx8fDE2OTkwMjQ4NTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://www.notjustsql.com/p/how-a-pet-project-can-supercharge-your-career&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:138553356,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:1,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Not just SQL&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a041bdd-f1c5-4faf-82cf-a9906c042412_1080x1080.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>Here&#8217;s two such projects of my own:</p><ul><li><p><a href="https://github.com/cnstlungu/portable-data-stack-dagster">A Portable data stack &#8220;Analytics in a Box&#8221; with Docker, Dagster, dbt, DuckDB, PostgreSQL and Superset</a> </p></li><li><p><a href="https://github.com/cnstlungu/portable-data-stack-mage">A similar one with Docker, Mage, dbt, DuckDB,and Superset</a> </p><p></p></li></ul><h3><strong>It&#8217;s time to build</strong></h3><p>The key takeaway here is to get building. Start creating, experimenting, applying, and sharing what you learn. Whether it's an individual project stemming from your own idea or a guided project, the experience you gain from practical application is invaluable.</p><p>Remember, the goal is to <s>become proficient</s> solve real-life problems and be confident in your skills, not just to collect certificates. So, get out there and start building your path to success in Analytics! Don't give in to tutorial hell.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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 Not just SQL! 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>]]></content:encoded></item><item><title><![CDATA[How tinkering in middle school helps me as a Data Engineer today]]></title><description><![CDATA[Turning Time 'Wasted' into an Investment in Your Future Self]]></description><link>https://www.notjustsql.com/p/how-tinkering-in-middle-school-helps</link><guid isPermaLink="false">https://www.notjustsql.com/p/how-tinkering-in-middle-school-helps</guid><dc:creator><![CDATA[Constantin Lungu]]></dc:creator><pubDate>Fri, 24 May 2024 04:56:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9kSh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cdf450c-e29b-4d73-aa8d-ad69dcb464d1_1152x640.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>So here&#8217;s a low-key motivational story.<br><br>It was late 2006, maybe early 2007, and I was in middle school, very interested in computers. I had just successfully convinced my mom to let me keep my computer on for five full days so I could download openSUSE &#128039; Linux (which was spread across multiple ISO files).<br><br>Even five days were a big win since my ISP was offering 64 kbit/s for external sites but up to 256 kbit/s for websites in our country &#127474;&#127465;</p><p>. So, I found a local mirror and started downloading. Anyway, it turned out openSUSE was too complex for me.<br><br>Then, I read that Ubuntu was the newbie-friendly one. Back in the day, there was a service called ShipIt, which sent free Ubuntu copies by mail. So here I am at my local post office in a small &#127474;&#127465; Moldovan town - they even asked me to open the package so they could check what was inside.<br><br>One of the first things I did after installing it? Figuring out how to log in to root automatically without entering the password. No need to enter the long and secure password (inspired by cartoon heroes) every time I needed to sudo apt-get install a package, I thought. I even deleted the other user so the computer would run smoother. &#128513;<br><br>It took me a while, but I was so happy with myself. I spent the next year tinkering and trying to install Windows games on &#128039; Linux. Then I forgot about the penguin altogether for the next 10 years until I became a data engineer.<br><br>But some of the things I learned back in the day, a good 18 years ago, like terminal basics and, more importantly, the patience to tinker with tech stuff until I got it done, have always stayed with me.<br><br>A couple of takeaways:<br>&#128313; Never give up: keep trying until you get it done.<br>&#128313; Don't waste your effort: focus on what you want to achieve.<br>&#128313; Iterate fast: don't get stuck in minutiae (yes, it's my own word); try, fail, try another approach.<br>&#128313; Learning is like investing: what you put in today will help you down the road.<br>&#128313; Getting smart takes time: you will inevitably do dumb things like I did with the root user (which is not safe; the &#9888;&#65039; warnings are there for a reason), but you will come to know better.<br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9kSh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cdf450c-e29b-4d73-aa8d-ad69dcb464d1_1152x640.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9kSh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cdf450c-e29b-4d73-aa8d-ad69dcb464d1_1152x640.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9kSh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cdf450c-e29b-4d73-aa8d-ad69dcb464d1_1152x640.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9kSh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cdf450c-e29b-4d73-aa8d-ad69dcb464d1_1152x640.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9kSh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cdf450c-e29b-4d73-aa8d-ad69dcb464d1_1152x640.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9kSh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cdf450c-e29b-4d73-aa8d-ad69dcb464d1_1152x640.jpeg" width="1152" height="640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0cdf450c-e29b-4d73-aa8d-ad69dcb464d1_1152x640.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:640,&quot;width&quot;:1152,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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="https://substackcdn.com/image/fetch/$s_!9kSh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cdf450c-e29b-4d73-aa8d-ad69dcb464d1_1152x640.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9kSh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cdf450c-e29b-4d73-aa8d-ad69dcb464d1_1152x640.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9kSh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cdf450c-e29b-4d73-aa8d-ad69dcb464d1_1152x640.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9kSh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0cdf450c-e29b-4d73-aa8d-ad69dcb464d1_1152x640.jpeg 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 role="img" 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><title></title><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"></figcaption></figure></div>]]></content:encoded></item><item><title><![CDATA[Lessons from Chernobyl and how it relates to software engineering]]></title><description><![CDATA[How a tragedy's lessons can apply to building strong software teams]]></description><link>https://www.notjustsql.com/p/lessons-from-chernobyl-and-how-it</link><guid isPermaLink="false">https://www.notjustsql.com/p/lessons-from-chernobyl-and-how-it</guid><dc:creator><![CDATA[Constantin Lungu]]></dc:creator><pubDate>Mon, 22 Apr 2024 14:44:24 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1615279113483-82e6693dab8f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHx0cmFuc3BhcmVuY3l8ZW58MHx8fHwxNzEzNzkzNzkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Growing up in post-Soviet Moldova, I was repeatedly reminded of the Chernobyl disaster. It was a topic at school, we had liquidators in our small town, and I recall the television coverage each April as the anniversary approached.</p><p>The Chernobyl disaster stands out as one of the most horrific technological failures in history. I was struck by how a technology meant for good could cause such devastation when things went wrong. This sparked my interest, leading me to delve deeper into the details. There's even an <a href="https://www.imdb.com/title/tt7366338/">exceptional TV miniseries</a> that captures the event.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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 Not just SQL! 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>Like many catastrophic events, Chernobyl was a result of a dark combination of factors and coincidences&#8212;design flaws, human errors, negligence, technical oversights, flawed processes, and conflicting motivations.</p><p>Conflicting motivations? Yes! Despite knowing about the reactor's design flaws, people remained silent for fear of reprisal. Construction shortcuts were taken to meet deadlines and secure bonuses.</p><p>On that fateful night of April 26th, 1986, greed likely drove some to rush safety tests for bonuses, while fear paralyzed others from challenging reckless orders.</p><p>You might wonder, why does this matter now, 40 years later? And how does it relate to software?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1615279113483-82e6693dab8f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHx0cmFuc3BhcmVuY3l8ZW58MHx8fHwxNzEzNzkzNzkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1615279113483-82e6693dab8f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHx0cmFuc3BhcmVuY3l8ZW58MHx8fHwxNzEzNzkzNzkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1615279113483-82e6693dab8f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHx0cmFuc3BhcmVuY3l8ZW58MHx8fHwxNzEzNzkzNzkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1615279113483-82e6693dab8f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHx0cmFuc3BhcmVuY3l8ZW58MHx8fHwxNzEzNzkzNzkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1615279113483-82e6693dab8f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHx0cmFuc3BhcmVuY3l8ZW58MHx8fHwxNzEzNzkzNzkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1615279113483-82e6693dab8f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHx0cmFuc3BhcmVuY3l8ZW58MHx8fHwxNzEzNzkzNzkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="1080" height="727" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1615279113483-82e6693dab8f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHx0cmFuc3BhcmVuY3l8ZW58MHx8fHwxNzEzNzkzNzkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:727,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;white and black diamond shape illustration&quot;,&quot;title&quot;:&quot;white and black diamond shape illustration&quot;,&quot;type&quot;:&quot;image/jpg&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="white and black diamond shape illustration" title="white and black diamond shape illustration" srcset="https://images.unsplash.com/photo-1615279113483-82e6693dab8f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHx0cmFuc3BhcmVuY3l8ZW58MHx8fHwxNzEzNzkzNzkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1615279113483-82e6693dab8f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHx0cmFuc3BhcmVuY3l8ZW58MHx8fHwxNzEzNzkzNzkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1615279113483-82e6693dab8f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHx0cmFuc3BhcmVuY3l8ZW58MHx8fHwxNzEzNzkzNzkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1615279113483-82e6693dab8f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHwxfHx0cmFuc3BhcmVuY3l8ZW58MHx8fHwxNzEzNzkzNzkxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 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 role="img" 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><title></title><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">Photo by <a href="https://unsplash.com/@wilhelmgunkel">Wilhelm Gunkel</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>Consider your team or company culture. Are you incentivized to prioritize doing the right thing over meeting deadlines or earning bonuses?</p><p>Is there an environment that fosters speaking up when things are amiss? Can you take responsibility for mistakes, even if it means facing criticism?</p><p>Developing quality software is not an easy task, and aligning people's interests with the greater good is crucial.</p><p>Establishing a culture of openness and transparency, alongside appropriate incentives, should be a priority for anyone leading a team.</p><p>In life and software, mishaps occur. However, when people's motivations are aligned, we can collectively work better towards the same goal.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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 Not just SQL! 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>]]></content:encoded></item><item><title><![CDATA[Why does your Data Warehouse need to look more like a pharmacy than a retail store?]]></title><description><![CDATA[I was following a discussion about the &#8220;Self-Service paradox&#8221;.]]></description><link>https://www.notjustsql.com/p/why-does-your-data-warehouse-need</link><guid isPermaLink="false">https://www.notjustsql.com/p/why-does-your-data-warehouse-need</guid><dc:creator><![CDATA[Constantin Lungu]]></dc:creator><pubDate>Mon, 15 Apr 2024 12:35:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!1Hzw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871e9804-41b4-46ae-9e88-29133f23dea2_727x500.jpeg" 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="https://substackcdn.com/image/fetch/$s_!1Hzw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871e9804-41b4-46ae-9e88-29133f23dea2_727x500.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1Hzw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871e9804-41b4-46ae-9e88-29133f23dea2_727x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1Hzw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871e9804-41b4-46ae-9e88-29133f23dea2_727x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1Hzw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871e9804-41b4-46ae-9e88-29133f23dea2_727x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1Hzw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871e9804-41b4-46ae-9e88-29133f23dea2_727x500.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1Hzw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871e9804-41b4-46ae-9e88-29133f23dea2_727x500.jpeg" width="727" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/871e9804-41b4-46ae-9e88-29133f23dea2_727x500.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:727,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;No alt text provided for this image&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="No alt text provided for this image" title="No alt text provided for this image" srcset="https://substackcdn.com/image/fetch/$s_!1Hzw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871e9804-41b4-46ae-9e88-29133f23dea2_727x500.jpeg 424w, https://substackcdn.com/image/fetch/$s_!1Hzw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871e9804-41b4-46ae-9e88-29133f23dea2_727x500.jpeg 848w, https://substackcdn.com/image/fetch/$s_!1Hzw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871e9804-41b4-46ae-9e88-29133f23dea2_727x500.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!1Hzw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F871e9804-41b4-46ae-9e88-29133f23dea2_727x500.jpeg 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 role="img" 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><title></title><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>I was following a discussion about the &#8220;Self-Service paradox&#8221;. Then I've seen another LinkedIn post about the random 'one-off' requests.<br><br>And then memories just poured in.<br><br>When I just started working in Analytics a decade ago, I was pretty hyped up with this idea of data democratization. As an analyst with too much time on my hands, I thought: with the right infra in place, everyone interested can access all data in the org (minus sensitives of course) and uncover some &#8220;insights&#8221; that will help improve how things work. Data is fair game for everyone.<br><br>Time flies. I&#8217;ve picked up SQL and with a couple of years of experience, I was working as a Business Intelligence Developer, working across multiple business areas and industries. The reality struck me. <br><br>Even apparently (for my unprepared mind) straightforward things like revenue, there was not any consensus on how it should be calculated. One person might think of it as revenue once the order has been placed, another once it was paid for and yet another one it was handed out for delivery. Or delivered? You get the idea.<br><br>Then, I could get odd &#8216;one-off&#8217; request asking for this or that piece of data. Aggregated at this level, filtering out X and Y. They&#8217;re all the same but equally different. People would build entire siloed ecosystems of their own, report packs, presentation decks, all sourced from &#8216;raw data&#8217; provided by engineers. It became clear that this is not a sustainable track.<br><br>Why was this happening? Maybe the analyst wasn&#8217;t comfortable with SQL or with the self-service tools of the time like SSAS Cubes + Pivots in Excel. Perhaps there is no data dictionary in place so people don't know what these columns represent. And what are these huuuge integer keys for?<br><br>Does this amount include tax or not? How about shipping? What about returns?<br><br>Or maybe this data hasn't landed yet in the Data Warehouse and we are due to integrate it sometimes Q3 in 2 years. Or maybe they don't trust out transformations?<br><br>Without proper controls, this *free-for-all* leads to conflicting metrics, a skewed understanding of how good a company is doing and overall, and overall, different yardsticks doing the measurements.<br><br>With regards to the analogy I&#8217;ve used in the title, I believe that the we should treat our Data Warehouse more like a pharmacy and less like a retail store.<br><br>Surely, there are over-the-counter products, MDs and treatments. But every one of those comes with instructions and a number of dedicated professionals that can guide and help you when needed. And for some you need a prescription.<br><br>I'm very happy when someone uses the data that I help deliver. We have a duty to act as stewards and custodians for the data we are entrusted to process, including the Analytical products it is feeding. Not restrict and keep exclusive to our silos, but inform, educate, collaborate and build for better business outcomes.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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 Not just SQL! 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>]]></content:encoded></item><item><title><![CDATA[Not just SQL - Episode 2]]></title><description><![CDATA[Data Radar, More than just coding, Creator Update and, of course, random things I've read on the internet]]></description><link>https://www.notjustsql.com/p/not-just-sql-episode-2</link><guid isPermaLink="false">https://www.notjustsql.com/p/not-just-sql-episode-2</guid><dc:creator><![CDATA[Constantin Lungu]]></dc:creator><pubDate>Fri, 08 Dec 2023 12:02:08 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1a23f94d-ce6c-4154-9181-4e7cff911139_1200x540.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="pullquote"><p>The cold winter is here in the Northern Hemisphere, but here&#8217;s a very warm &#8216;Welcome!&#8217; to the second issue of <strong>Not Just SQL</strong>. It might have taken a while to write it out (busy month, right?), but here&#8217;s the latest I wanted to share with you. Let&#8217;s dig in! </p></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4XJC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da3e299-1a23-42f0-9554-8c0be5f30a63_1200x540.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4XJC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da3e299-1a23-42f0-9554-8c0be5f30a63_1200x540.png 424w, https://substackcdn.com/image/fetch/$s_!4XJC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da3e299-1a23-42f0-9554-8c0be5f30a63_1200x540.png 848w, https://substackcdn.com/image/fetch/$s_!4XJC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da3e299-1a23-42f0-9554-8c0be5f30a63_1200x540.png 1272w, https://substackcdn.com/image/fetch/$s_!4XJC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da3e299-1a23-42f0-9554-8c0be5f30a63_1200x540.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4XJC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da3e299-1a23-42f0-9554-8c0be5f30a63_1200x540.png" width="1200" height="540" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9da3e299-1a23-42f0-9554-8c0be5f30a63_1200x540.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:540,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1065055,&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="https://substackcdn.com/image/fetch/$s_!4XJC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da3e299-1a23-42f0-9554-8c0be5f30a63_1200x540.png 424w, https://substackcdn.com/image/fetch/$s_!4XJC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da3e299-1a23-42f0-9554-8c0be5f30a63_1200x540.png 848w, https://substackcdn.com/image/fetch/$s_!4XJC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da3e299-1a23-42f0-9554-8c0be5f30a63_1200x540.png 1272w, https://substackcdn.com/image/fetch/$s_!4XJC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9da3e299-1a23-42f0-9554-8c0be5f30a63_1200x540.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 role="img" 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><title></title><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>Exploring SQLMesh - a dbt challenger?</h1><p>Working in Data Analytics has definitely changed a lot since I first started almost a decade ago. SQL queries are now hopefully saved less often in text files and emailed. Businesses need shorter data-to-insights turnaround, better monitoring, data quality controls they can trust and of course, a better experience for the Analytics staff. This has, in turn, led to an explosion of different projects and products looking to solve a particular pain point. </p><p>One such competitive space is the data transformation framework. The elephant in the room in of course <a href="https://www.getdbt.com/">dbt</a>, whose mother company dbt Labs is currently <a href="https://www.forbes.com/sites/kenrickcai/2022/02/24/dbt-labs-series-d-4-billion-less-than-planned/">valued at multiple billions</a>. There&#8217;s also <a href="https://dataform.co/">Dataform</a>, acquired by Google and integrated in the their cloud platform.</p><p>One new player on the block is <a href="https://sqlmesh.readthedocs.io/en/latest/">SQLMesh</a>. It has a number of very interesting promises, some that could be regarded as differentiators.</p><ul><li><p>A BIG accent on DataOps: it surely looks like this tool was built by practicing Data Engineers. Easiness of managing different environments, a Terraform-like &#8220;plan-apply&#8221; workflow to assess and apply changes, attention to concepts like <a href="https://sqlmesh.readthedocs.io/en/latest/guides/incremental_time/#running-run">incremental loading</a> are just some of the features that stand out. </p></li><li><p>No-copy virtual environments, which I understand Snowflake also has. This means that you not longer need to have multiple *physical* copies of the same data across environments, thus saving storage costs.</p></li><li><p>A semantic understanding of SQL, built with <a href="https://github.com/tobymao/sqlglot">SQLglot</a> which transpiles i.e. &#8216;translates&#8217; it, rather than just generates the SQL code based on a template. This allows it to distinguish between breaking and non-breaking changes (think removing a column that is used by downstream models versus removing a unused one), while also allowing for flexibility to work across SQL dialects.</p></li><li><p>Table and column lineage: one of the most common current requirements to Modern Data stack products.</p></li></ul><p>I&#8217;ve decided to try it out using this <a href="https://sqlmesh.readthedocs.io/en/stable/quick_start">quickstart guide</a>. The example project was using DuckDB as an analytical database, a pairing I appreciate. For starters, I&#8217;ve read a parquet file from a PostgreSQL instance, transforming the data using several steps in a pipeline.</p><p>One can use the tool with the built-in UI or the cli, and it offers an adapter to use with existing dbt models (with some changes).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LPRl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7728fac-6673-443e-8826-4cd0eee80d23_2553x1318.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LPRl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7728fac-6673-443e-8826-4cd0eee80d23_2553x1318.png 424w, https://substackcdn.com/image/fetch/$s_!LPRl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7728fac-6673-443e-8826-4cd0eee80d23_2553x1318.png 848w, https://substackcdn.com/image/fetch/$s_!LPRl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7728fac-6673-443e-8826-4cd0eee80d23_2553x1318.png 1272w, https://substackcdn.com/image/fetch/$s_!LPRl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7728fac-6673-443e-8826-4cd0eee80d23_2553x1318.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LPRl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7728fac-6673-443e-8826-4cd0eee80d23_2553x1318.png" width="1456" height="752" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d7728fac-6673-443e-8826-4cd0eee80d23_2553x1318.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:752,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:323759,&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="https://substackcdn.com/image/fetch/$s_!LPRl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7728fac-6673-443e-8826-4cd0eee80d23_2553x1318.png 424w, https://substackcdn.com/image/fetch/$s_!LPRl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7728fac-6673-443e-8826-4cd0eee80d23_2553x1318.png 848w, https://substackcdn.com/image/fetch/$s_!LPRl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7728fac-6673-443e-8826-4cd0eee80d23_2553x1318.png 1272w, https://substackcdn.com/image/fetch/$s_!LPRl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd7728fac-6673-443e-8826-4cd0eee80d23_2553x1318.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 role="img" 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><title></title><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 Slack community is active and was able to assist me quickly when I had questions.</p><p>While the tool is under active development and has some rough edges, it&#8217;s definitely something to keep an eye on. As with any domain, competition is very healthy for everyone involved.</p><p>If you&#8217;d like find out more, a very interesting analysis comparing three such solutions (two of which are DBT and SQLMesh, can be found below.</p><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:135809856,&quot;url&quot;:&quot;https://datajargon.substack.com/p/dbt-vs-sdf-vs-sqlmesh&quot;,&quot;publication_id&quot;:1493970,&quot;publication_name&quot;:&quot;The Data Jargon Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b14ac3f-a096-45c9-903d-80cb4ba1191a_400x400.jpeg&quot;,&quot;title&quot;:&quot;DBT vs SDF vs SQLMesh&quot;,&quot;truncated_body_text&quot;:&quot;For some of you, that headline might not mean much. That&#8217;s ok, and this one might not be for you. I&#8217;m mixing in some technical posts every once and a while. This is the first of the series. If you&#8217;re reading this, I&#8217;m going to assume you know what DBT is. You don&#8217;t need to know what SQLMesh is, or have an &#8230;&quot;,&quot;date&quot;:&quot;2023-08-22T16:43:16.457Z&quot;,&quot;like_count&quot;:24,&quot;comment_count&quot;:2,&quot;bylines&quot;:[{&quot;id&quot;:116952103,&quot;name&quot;:&quot;Joe Naso&quot;,&quot;handle&quot;:&quot;datajargon&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b14ac3f-a096-45c9-903d-80cb4ba1191a_400x400.jpeg&quot;,&quot;bio&quot;:&quot;I help companies fix their data problems | data engineering and architecture | analytics | Prev: @postscriptio @pymetrics @accenture and others | https://t.co/aG7mIP0LlF&quot;,&quot;profile_set_up_at&quot;:&quot;2023-03-14T20:40:37.856Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:1460789,&quot;user_id&quot;:116952103,&quot;publication_id&quot;:1493970,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:1493970,&quot;name&quot;:&quot;The Data Jargon Newsletter&quot;,&quot;subdomain&quot;:&quot;datajargon&quot;,&quot;custom_domain&quot;:null,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;A newsletter about data, business and the business of data. &quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7b14ac3f-a096-45c9-903d-80cb4ba1191a_400x400.jpeg&quot;,&quot;author_id&quot;:116952103,&quot;theme_var_background_pop&quot;:&quot;#EA410B&quot;,&quot;created_at&quot;:&quot;2023-03-14T20:46:09.625Z&quot;,&quot;rss_website_url&quot;:null,&quot;email_from_name&quot;:null,&quot;copyright&quot;:&quot;Joe Naso&quot;,&quot;founding_plan_name&quot;:null,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;disabled&quot;,&quot;language&quot;:null,&quot;explicit&quot;:false}}],&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://datajargon.substack.com/p/dbt-vs-sdf-vs-sqlmesh?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!rNNS!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7b14ac3f-a096-45c9-903d-80cb4ba1191a_400x400.jpeg" loading="lazy"><span class="embedded-post-publication-name">The Data Jargon Newsletter</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">DBT vs SDF vs SQLMesh</div></div><div class="embedded-post-body">For some of you, that headline might not mean much. That&#8217;s ok, and this one might not be for you. I&#8217;m mixing in some technical posts every once and a while. This is the first of the series. If you&#8217;re reading this, I&#8217;m going to assume you know what DBT is. You don&#8217;t need to know what SQLMesh is, or have an &#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">3 years ago &#183; 24 likes &#183; 2 comments &#183; Joe Naso</div></a></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.notjustsql.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 Not just SQL! 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>Data radar</h1><p>Here&#8217;s a some more interesting projects I&#8217;ve encountered in the past few weeks.</p><h2>Datadiff</h2><p>As a Data Engineer, an important challenge in my work is mitigating risk as part of change management. One of the main goals there is avoiding regressions. This is typically in the form of sanity checks - think queries that would compare the state before and after changes: row counts, count of unique keys, ensuring grain alignment with the requirements, corner cases.</p><p>I&#8217;ve recently stumbled upon <a href="https://www.datafold.com/data-diff">Datadiff</a> by <a href="https://www.datafold.com">Datafold</a>, an automated regression testing tool, as illustrated <a href="https://www.datafold.com/blog/code-review-best-practices-for-analytics-engineers">in this nice blog post</a>. Deploy it as part of your CI/CD pipeline to get these automated checks.</p><h2>Malloy</h2><p>Courtesy to the <a href="https://en.wikipedia.org/wiki/Lindy_effect">Lindy effect</a>, SQL has, in my humble opinion, quite a long lifetime ahead of it. Its low barrier of entry, ubiquity and long history (hello, late 1970s) give it quite a gravitational pull. That does not stop people from thinking about alternatives though.</p><p>I&#8217;ve recently discovered <a href="https://en.wikipedia.org/wiki/Lindy_effect">Malloy</a>, an open-source language specifically designed to perform data processing tasks. It can of course translate to SQL.  Here&#8217;s a taste of how it looks and the equivalent SQL.</p><p><em>Queries reproduced from <a href="https://github.com/malloydata/malloy">Malloy github page</a>.</em></p><pre><code>run: bigquery.table('malloy-data.faa.flights') -&gt; {
  where: origin ? 'SFO'
  group_by: carrier
  aggregate:
    flight_count is count()
    average_flight_time is flight_time.avg()
}</code></pre><pre><code>SELECT
   carrier,
   COUNT(*) as flight_count,
   AVG(flight_time) as average_flight_time
FROM `malloy-data.faa.flights`
WHERE origin = 'SFO'
GROUP BY carrier
ORDER BY flight_count desc         
-- malloy automatically orders by the first aggregate</code></pre><p></p><h2>Turntable</h2><p>Does the phrase &#8220;how the tables have turned&#8221; qualify as SQL joke? You know, like that one with the tables being joined in bar?  I&#8217;ve also discovered that a turntable is the device that plays vinyls.</p><p>On a more serious note though, <a href="https://www.turntable.so/">Turntables</a> is a startup promising to speed up data pipeline creation and management using AI. What caught my eye though,  is their  <a href="https://www.turntable.so/extension">free VSCode extension</a>, catering to dbt core users.</p><p>It offers no less that column-level lineage, an AI-powered docs auto-filling and model validation before you actually run it. Definitely trying this one.</p><p></p><h1>More than just coding</h1><ul><li><p><a href="https://www.theverge.com/2023/12/6/23990466/google-gemini-llm-ai-model">Google launches Gemini, a new GPT-4 challenger</a></p></li><li><p><a href="https://ludic.mataroa.blog/blog/i-accidentally-saved-half-a-million-dollars">How an engineer saved his company half a million dollars</a></p></li><li><p><a href="https://blog.pragmaticengineer.com/devternity-fake-speakers/">Tech conference organizers create fake female speakers to increase appearance of diversity</a></p></li><li><p><a href="https://www.engguidebook.com">Gergely Orosz&#8217;s new book - The Software Engineer&#8217;s Guidebook</a></p><p></p><p>How saying healthy &#8216;NO&#8217;s can be help you get ahead</p></li></ul><div class="embedded-post-wrap" data-attrs="{&quot;id&quot;:138266477,&quot;url&quot;:&quot;https://www.thecaringtechie.com/p/strategies-for-saying-no&quot;,&quot;publication_id&quot;:341480,&quot;publication_name&quot;:&quot;Musings Of A Caring Techie&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86cf7d99-7392-4bee-af0c-78f8c595a75f_1280x1280.png&quot;,&quot;title&quot;:&quot;Strategies and examples on how to say &#8220;no&#8221; effectively and guilt-free&quot;,&quot;truncated_body_text&quot;:&quot;&#8220;Yes, sure, I can take that on. Don&#8217;t worry about it.&#8221; How many times have you said those words and immediately regretted it, knowing that your plate is already full? If you also have a hard time saying &#8220;no&#8221; to things, I&#8217;m with you. Saying &#8220;no&#8221; is a challenge many of us face.&quot;,&quot;date&quot;:&quot;2023-10-25T13:00:34.853Z&quot;,&quot;like_count&quot;:24,&quot;comment_count&quot;:4,&quot;bylines&quot;:[{&quot;id&quot;:4332862,&quot;name&quot;:&quot;Irina Stanescu&quot;,&quot;handle&quot;:&quot;thecaringtechie&quot;,&quot;previous_name&quot;:null,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/321918c5-41fa-4bf8-bf6a-c8711783d74d_1242x1213.jpeg&quot;,&quot;bio&quot;:&quot;Staff Software Engineer turned hands-on leader and leadership coach. Ex-Google, ex-Uber, currently at an early stage startup. \n\nI write a weekly newsletter for leaders and ICs about leadership, tech culture and building a thriving career in Tech.&quot;,&quot;profile_set_up_at&quot;:&quot;2021-04-26T22:53:28.565Z&quot;,&quot;publicationUsers&quot;:[{&quot;id&quot;:262680,&quot;user_id&quot;:4332862,&quot;publication_id&quot;:341480,&quot;role&quot;:&quot;admin&quot;,&quot;public&quot;:true,&quot;is_primary&quot;:false,&quot;publication&quot;:{&quot;id&quot;:341480,&quot;name&quot;:&quot;Musings Of A Caring Techie&quot;,&quot;subdomain&quot;:&quot;thecaringtechie&quot;,&quot;custom_domain&quot;:&quot;www.thecaringtechie.com&quot;,&quot;custom_domain_optional&quot;:false,&quot;hero_text&quot;:&quot;Practical insights for doing your best work based on my experience in software engineering at Big Tech (Google, Uber) and early-stage startups.&quot;,&quot;logo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86cf7d99-7392-4bee-af0c-78f8c595a75f_1280x1280.png&quot;,&quot;author_id&quot;:4332862,&quot;theme_var_background_pop&quot;:&quot;#67bdfc&quot;,&quot;created_at&quot;:&quot;2021-04-20T02:08:08.146Z&quot;,&quot;rss_website_url&quot;:null,&quot;email_from_name&quot;:&quot;Irina Stanescu from The Caring Techie&quot;,&quot;copyright&quot;:&quot;Irina Stanescu&quot;,&quot;founding_plan_name&quot;:&quot;Founding Member&quot;,&quot;community_enabled&quot;:true,&quot;invite_only&quot;:false,&quot;payments_state&quot;:&quot;enabled&quot;,&quot;language&quot;:null,&quot;explicit&quot;:false}}],&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;utm_campaign&quot;:null,&quot;belowTheFold&quot;:true,&quot;type&quot;:&quot;newsletter&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="EmbeddedPostToDOM"><a class="embedded-post" native="true" href="https://www.thecaringtechie.com/p/strategies-for-saying-no?utm_source=substack&amp;utm_campaign=post_embed&amp;utm_medium=web"><div class="embedded-post-header"><img class="embedded-post-publication-logo" src="https://substackcdn.com/image/fetch/$s_!5lBV!,w_56,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86cf7d99-7392-4bee-af0c-78f8c595a75f_1280x1280.png" loading="lazy"><span class="embedded-post-publication-name">Musings Of A Caring Techie</span></div><div class="embedded-post-title-wrapper"><div class="embedded-post-title">Strategies and examples on how to say &#8220;no&#8221; effectively and guilt-free</div></div><div class="embedded-post-body">&#8220;Yes, sure, I can take that on. Don&#8217;t worry about it.&#8221; How many times have you said those words and immediately regretted it, knowing that your plate is already full? If you also have a hard time saying &#8220;no&#8221; to things, I&#8217;m with you. Saying &#8220;no&#8221; is a challenge many of us face&#8230;</div><div class="embedded-post-cta-wrapper"><span class="embedded-post-cta">Read more</span></div><div class="embedded-post-meta">3 years ago &#183; 24 likes &#183; 4 comments &#183; Irina Stanescu</div></a></div><p></p><h1>Creator update</h1><h2>Searching for a palatable monetization strategy</h2><p>As a novice content creator, ever since I&#8217;ve started writing on a consistent basis, I also pay attention to how other people in tech/data space do it. </p><p>There seems to be an ever increasing number of people entering the game. Creating tech content can be quite resource-intensive, so it&#8217;s only normal that a lot of people with a consistent following are trying to sell you something. A course or bootcamp, a book, 1-on-1 mentoring sessions. But the important part here is how are they doing it. </p><p>How do you create a more palatable monetization strategy? Something that will allow you to earn (or supplement) your livelihood but not disappoint your audience as a creator.</p><p>A couple of days ago, I&#8217;ve read an interesting <a href="https://www.linkedin.com/posts/christo-horton_ive-unfollowed-about-a-dozen-li-influencers-activity-7138184562391580672-08SF?utm_source=share&amp;utm_medium=member_desktop">post</a> about how an appropriate monetization strategy should look like. </p><p>If had to define my stand, I&#8217;d say:</p><ul><li><p>the creator should continue to offer good value for people not willing or not being able to pay (also because, in the attention economy, it&#8217;s might be the right business decision)</p></li><li><p>paid products or content should be accessible to people at different price points, based on how deep they&#8217;d like to engage (the author of the above post mentions  a guide &#8594; paid community &#8594; in-person retreat structure as an example) and afford to spend</p></li><li><p>some things of course should be non-negotiable, such as having your audience best interests at heart and not promoting something that you deem immoral or harmful in any way.</p></li></ul><p>This is, of course, a page still to be written for me, but I think it&#8217;s beneficial to think about these things beforehand. What would your ideal strategy be?</p><p></p><h2>Tools I use as a content creator</h2><p>As you may already know, in addition to this page and <a href="https://www.linkedin.com/in/constantin-lungu-668b8756/">Linkedin</a>, I publish on <a href="https://datawise.dev">Datawise</a> and cross-post on <a href="https://medium.com/data-engineers-notes">Data Engineer&#8217;s Notes</a>, a Medium publication I run.</p><p>Content creators use a wide array of tools to get their job done. Now, nobody shared these with me, but I&#8217;ve seen a lot of people using them, so I&#8217;d like to share a rough list of things I use to help me create content.</p><p><strong>Plan</strong>: </p><ul><li><p><a href="https://www.notion.so">Notion</a> for taking notes and writing down ideas for future posts.  I&#8217;m definitely using it for less than it can.</p></li></ul><p><strong>Design:</strong></p><ul><li><p><a href="https://www.canva.com">Canva</a>: a free graphic design tool, useful to create slides, graphs and carousel posts for Linkedin</p></li><li><p>I&#8217;m showcasing a lot of queries to illustrate SQL concepts, snippets which I beautify with <a href="https://ray.so">Ray</a> and <a href="https://carbon.now.sh">Carbon</a> (pick one that suits you best). </p></li><li><p>For presenting tables (typically snippet output), I&#8217;m copying the query output as JSON and using a <a href="https://tableconvert.com/json-to-ascii">converter</a> to create an ASCII table. This then goes into one of the beautifiers from the previous point. Sadly this doesn&#8217;t work with STRUCTS/ARRAYS, so the last resort is taking a screenshot of it.</p></li></ul><p><strong>Analyze:</strong></p><ul><li><p>Sadly Linkedin does not provide a straightforward way to know the exact hour something was posted, so you need a <a href="https://ollie-boyd.github.io/Linkedin-post-timestamp-extractor">specialized tool</a> to extract the timestamp when a particular piece of content was posted for your analytics.</p></li></ul><p></p><h1>Content Recap</h1><p>Here&#8217;s an overview of my articles posted on <a href="https://datawise.dev">Datawise</a> since the last issue of <strong>Not Just SQL</strong>.</p><h3>SQL &#128240;</h3><ul><li><p><a href="https://datawise.dev/using-correlated-subqueries-in-bigquery">Correlated subqueries: what are they and how to use them?</a></p></li><li><p><a href="https://datawise.dev/using-array-agg-in-bigquery">Using ARRAY_AGG in BigQuery</a></p></li><li><p><a href="https://datawise.dev/tidying-up-window-functions-in-bigquery-with-named-windows">Cleaner window functions calls with named windows</a></p></li><li><p><a href="https://datawise.dev/comparing-ranking-functions-in-bigquery">Comparing ranking functions</a></p></li><li><p><a href="https://datawise.dev/using-structs-for-audit-fields-in-bigquery">Create audit fields with STRUCTS</a></p></li><li><p><a href="https://datawise.dev/using-select-with-except-and-replace">Using SELECT * with EXCEPT and REPLACE</a></p></li><li><p><a href="https://datawise.dev/de-duplicating-with-rownumber-vs-arrayagg">De-duplication with ROW_NUMBER vs ARRAY_AGG</a></p></li><li><p><a href="https://datawise.dev/does-order-of-expressions-in-the-where-clause-matter">Does order of expressions in the WHERE clause matter?</a></p></li><li><p><a href="https://datawise.dev/filling-up-missing-values-with-lastvalue">Filling up missing values with LAST_VALUE</a></p></li><li><p><a href="https://datawise.dev/like-all-and-like-any-in-bigquery">Quantified LIKE operator in BigQuery</a></p></li><li><p><a href="https://datawise.dev/select-as-struct-and-select-as-value">Value Tables, SELECT AS VALUE and SELECT AS STRUCT</a></p></li></ul><h3>Python</h3><ul><li><p><a href="https://datawise.dev/dunder-magic-functions-in-python">What are magic functions in Python and why do we need them</a></p></li><li><p><a href="https://datawise.dev/comprehensions-in-python">Comprehensions in Python</a></p></li></ul><p></p><h1>Not really about tech</h1><p>Here are some things that are not at all related to computers but which I found interesting.</p><ul><li><p><a href="https://en.wikipedia.org/wiki/Flywheel_energy_storage">Flywheel energy storage</a> - an energy storage principle powering kids&#8217; friction toys and many other things </p></li><li><p><a href="https://www.yorkshirepost.co.uk/news/yorkshire-tea-shuts-down-troll-in-hilarious-online-spat-over-foreign-growing-589309">A mild controversy over one of my favorite drinks and what are tea blends</a></p></li><li><p><a href="https://en.wikipedia.org/wiki/Knot_(unit)">Why the `knot` unit is still around and how it is useful</a></p></li><li><p><a href="https://en.wikipedia.org/wiki/Hoop_snake">The hoop snake</a> - a legendary creature from English-speaking folklore</p></li><li><p>One word origin, different stories: <a href="https://en.wikipedia.org/wiki/Behemoth">Behemoth</a> , <a href="https://en.wikipedia.org/wiki/Bahamut">Bahamut</a> and <a href="https://en.wiktionary.org/wiki/%D0%B1%D0%B5%D0%B3%D0%B5%D0%BC%D0%BE%D1%82#Russian">hippos</a></p></li></ul><div class="pullquote"><p></p><p>Hope you&#8217;ve enjoyed this issue of <strong>Not Just SQL</strong>! I would appreciate your feedback and, should you find it useful, share it to your network so that the next issue appears sooner. </p><p>Thank you!</p></div>]]></content:encoded></item><item><title><![CDATA[Not Just SQL - October '23]]></title><description><![CDATA[Hello data fans and internet folks in general! I'm really excited to welcome you to the very first post of my newsletter-blog mix. I'm Constantin Lungu, and I've spent the last ten years working with data, as a Data Analyst, Business Intelligence Developer, and currently a Data Engineer. You can think of this space as the next chapter in my data story, and I'm glad you're here to be a part of it!]]></description><link>https://www.notjustsql.com/p/not-just-sql-october-23</link><guid isPermaLink="false">https://www.notjustsql.com/p/not-just-sql-october-23</guid><dc:creator><![CDATA[Constantin Lungu]]></dc:creator><pubDate>Wed, 01 Nov 2023 01:13:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9a041bdd-f1c5-4faf-82cf-a9906c042412_1080x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>A brief introduction</h2><p>Hello data fans and internet folks in general! I'm really excited to welcome you to the very first post of my newsletter-blog Frankenstein. My name is Constantin Lungu, and I've spent the last ten years working with data:  as a Data Analyst,  Business Intelligence Developer and Data Engineer. You can think of this page as the next chapter in my data story, and I'm glad you're here to be a part of it!</p><p></p><h2>Growing in Public as a Data Creator - I</h2><p>Does &#8220;building in public&#8221; apply to content creation? Or shall I better call it &#8220;growing in public&#8221; ? In this recurring series, I will be documenting my journey with writing about tech and personal branding.</p><p>Let&#8217;s start with a little backstory. I&#8217;ve always enjoyed writing on topics I care about. Given my line of work, I engage in technical storytelling as well (yes, I <em>sometimes</em> write documentation at work as well).</p><h4>Origins</h4><p>In the distant 2016 I was learning Data Analysis with Python while working as a BI Developer. At this stage, I&#8217;m just trying just to save the <a href="https://github.com/cnstlungu/incubator/blob/master/Python/Exploring%20Twitter%20Data%20using%20Python/Exploring%20Twitter%20Data%20using%20Python%20.ipynb">Jupyter notebooks</a>, so I remember how I did this or that.</p><p>Fast forward to 2020. Plenty of time during COVID and I make a couple of posts on <a href="https://medium.com/@cnstlungu">Medium</a>, sharing stories about <a href="https://medium.com/me/stats/post/87b023624a43?source=main_stats_page">my tinkering with Raspberry Pi </a>and <a href="https://medium.com/me/stats/post/59de2feea659?source=main_stats_page">how I studied for an AWS Certification</a>. A story like that is a compilation of issues encountered during a long project, so writing an article takes literal weeks. Sharing them to LinkedIn to very little engagement.</p><p>Let&#8217;s skip another 2 years or so to 2022, when I do another round of posting, this time around practical tips and tricks tied to problems I encounter while working day-to-day with BigQuery. The turnaround is still very slow - preparing an article is tedious and takes days. I submit them to a number of publications in Medium and get a couple of hundred views a month. Again, sharing them to LinkedIn to a dozen or so reactions.</p><p>Early 2023, I continue posting a couple of practical BigQuery walkthroughs. I enjoy writing them - straightforward, practical, easy to write. I also find them useful to myself - explaining something in writing helps you understand it better, iron out any issues, get some interesting feedback about something that could&#8217;ve been done in a different way. I decide to set up <a href="https://datawise.dev">datawise.dev</a> - my blog, hosted on Hashnode. I&#8217;m now cross-posting on Medium (with a canonical links).</p><p>Things started getting more interesting in August 2023. At this point I have maybe 1800 LinkedIn followers, but 80% of them are recruiters, so engagement on technical content I post is not great.</p><p>I was already following some big creators in the Data world, but I discovered the Creator Mode on LinkedIn and started paying attention to audience as well (before, I used to think only in terms of engagement - comments, reactions, re-posts). </p><p>One Friday in August, before leaving for the weekend, I wrote a short post about the <a href="https://www.linkedin.com/feed/update/urn:li:activity:7098295702987927552/">ROLLUP command in BigQuery</a>, which I found interesting since I never had to use it.</p><p>I was very surprised to see that it received ~270 reactions, easily more than the sum of all the reactions to my previous posts. Here&#8217;s the post.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LrAJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1612be7-d777-4628-bbc1-fd2bb9aee3bd_390x1014.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LrAJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1612be7-d777-4628-bbc1-fd2bb9aee3bd_390x1014.png 424w, https://substackcdn.com/image/fetch/$s_!LrAJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1612be7-d777-4628-bbc1-fd2bb9aee3bd_390x1014.png 848w, https://substackcdn.com/image/fetch/$s_!LrAJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1612be7-d777-4628-bbc1-fd2bb9aee3bd_390x1014.png 1272w, https://substackcdn.com/image/fetch/$s_!LrAJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1612be7-d777-4628-bbc1-fd2bb9aee3bd_390x1014.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LrAJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1612be7-d777-4628-bbc1-fd2bb9aee3bd_390x1014.png" width="390" height="1014" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c1612be7-d777-4628-bbc1-fd2bb9aee3bd_390x1014.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1014,&quot;width&quot;:390,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:205971,&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="https://substackcdn.com/image/fetch/$s_!LrAJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1612be7-d777-4628-bbc1-fd2bb9aee3bd_390x1014.png 424w, https://substackcdn.com/image/fetch/$s_!LrAJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1612be7-d777-4628-bbc1-fd2bb9aee3bd_390x1014.png 848w, https://substackcdn.com/image/fetch/$s_!LrAJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1612be7-d777-4628-bbc1-fd2bb9aee3bd_390x1014.png 1272w, https://substackcdn.com/image/fetch/$s_!LrAJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc1612be7-d777-4628-bbc1-fd2bb9aee3bd_390x1014.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 role="img" 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><title></title><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>At this moment, I start to get a little bit more interested about how LinkedIn works in general - I learn that the time you post matters, outbound links get posts penalized,  engagement in comments matters, nice images boost distribution and so on.</p><p>I decided to continue writing short, condensed, reproducible examples inspired by my Data Engineering practice, along the following lines:</p><ul><li><p>problem scenario &#8594; possible solution</p></li><li><p>new or less known feature &#8594; use cases</p></li><li><p>comparison of alternatives &#8594; pros &amp; cons and when to use which</p></li></ul><p>It&#8217;s October 2023 and I decide to set up <a href="https://www.notjustsql.com">this domain and a Substack presence</a>, although my idea about the format is not very precise yet &#128522;. </p><p></p><h4>Current situation</h4><p>I strive to write 3-5 times per week, and I have been consistently doing so for the last 10 weeks.  There are some promising numbers around content performance and the Medium numbers have never been higher. I&#8217;ve also managed to surpass 3k followers on LinkedIn, most of them new followers based on my posts.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ppuj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c761ac4-ede3-4c20-89c5-f54687356762_3000x3000.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ppuj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c761ac4-ede3-4c20-89c5-f54687356762_3000x3000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ppuj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c761ac4-ede3-4c20-89c5-f54687356762_3000x3000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ppuj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c761ac4-ede3-4c20-89c5-f54687356762_3000x3000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ppuj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c761ac4-ede3-4c20-89c5-f54687356762_3000x3000.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ppuj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c761ac4-ede3-4c20-89c5-f54687356762_3000x3000.jpeg" width="1456" height="1456" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c761ac4-ede3-4c20-89c5-f54687356762_3000x3000.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1456,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:646918,&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;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ppuj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c761ac4-ede3-4c20-89c5-f54687356762_3000x3000.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Ppuj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c761ac4-ede3-4c20-89c5-f54687356762_3000x3000.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Ppuj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c761ac4-ede3-4c20-89c5-f54687356762_3000x3000.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Ppuj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c761ac4-ede3-4c20-89c5-f54687356762_3000x3000.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 role="img" 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><title></title><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 is of course a great deal of variability in the content performance, due to an array of factors I&#8217;m analyzing at the moment - stay tuned for more here. Here&#8217;s a screenshot of the correlation matrix I&#8217;ve asked my data analyst - ChatGPT - to build with the data I&#8217;ve collected so far on my LinkedIn posts.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IAj6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0745b6d-f6fb-40c3-b524-96ae46bbe76c_1912x1366.bin" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IAj6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0745b6d-f6fb-40c3-b524-96ae46bbe76c_1912x1366.bin 424w, https://substackcdn.com/image/fetch/$s_!IAj6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0745b6d-f6fb-40c3-b524-96ae46bbe76c_1912x1366.bin 848w, https://substackcdn.com/image/fetch/$s_!IAj6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0745b6d-f6fb-40c3-b524-96ae46bbe76c_1912x1366.bin 1272w, https://substackcdn.com/image/fetch/$s_!IAj6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0745b6d-f6fb-40c3-b524-96ae46bbe76c_1912x1366.bin 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IAj6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0745b6d-f6fb-40c3-b524-96ae46bbe76c_1912x1366.bin" width="1456" height="1040" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c0745b6d-f6fb-40c3-b524-96ae46bbe76c_1912x1366.bin&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1040,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&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="https://substackcdn.com/image/fetch/$s_!IAj6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0745b6d-f6fb-40c3-b524-96ae46bbe76c_1912x1366.bin 424w, https://substackcdn.com/image/fetch/$s_!IAj6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0745b6d-f6fb-40c3-b524-96ae46bbe76c_1912x1366.bin 848w, https://substackcdn.com/image/fetch/$s_!IAj6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0745b6d-f6fb-40c3-b524-96ae46bbe76c_1912x1366.bin 1272w, https://substackcdn.com/image/fetch/$s_!IAj6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc0745b6d-f6fb-40c3-b524-96ae46bbe76c_1912x1366.bin 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 role="img" 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><title></title><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><h4>What&#8217;s next</h4><p>It&#8217;s of course a little hard to see the future, but I&#8217;m eyeing the following next steps:</p><ul><li><p>refine content: more value in a concise format that I would like to experiment with</p></li><li><p>analytics: find out what works best and use it to grow</p></li><li><p>more polish: a little bit of marketing magic applied to the content</p></li><li><p>diversification: write about more diverse topics that just BigQuery</p></li><li><p>personal projects: engage with new technologies and explore them for myself and my audience</p><p>    </p><div><hr></div><p></p></li></ul><h2>Things I&#8217;ve followed &#128073;</h2><ul><li><p>One of the hottest debates in tech (and on LinkedIn) this month was around Indian top executive statement that <a href="https://www.businessinsider.com/indian-billionaire-infosys-founder-calls-70-hour-workweek-2023-10">youth should be looking at 70-hour work weeks</a> for their country&#8217;s economic advancement.  I&#8217;ve also read about<a href="https://en.wikipedia.org/wiki/996_working_hour_system"> 9-9-6 work schedule</a> and <a href="https://en.wikipedia.org/wiki/Protestant_work_ethic">the Protestant Work Ethic</a> while at it. </p></li><li><p>OpenAI&#8217;s ChatGPT new release adds support for <a href="https://openai.com/blog/dall-e-3-is-now-available-in-chatgpt-plus-and-enterprise">DALL-E3</a> , so you can now generate interesting right there. I think I&#8217;m going to write a post-apocalyptic retro-futuristic novel with illustrations like the below</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ViFR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04db467f-24d8-435d-85ad-441d281e4760_1024x1024.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ViFR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04db467f-24d8-435d-85ad-441d281e4760_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!ViFR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04db467f-24d8-435d-85ad-441d281e4760_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!ViFR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04db467f-24d8-435d-85ad-441d281e4760_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!ViFR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04db467f-24d8-435d-85ad-441d281e4760_1024x1024.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ViFR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04db467f-24d8-435d-85ad-441d281e4760_1024x1024.webp" width="1024" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04db467f-24d8-435d-85ad-441d281e4760_1024x1024.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Photo: A 1950s-style Chernobyl nuclear power plant, with art deco architectural elements and large smokestacks. Cars from the 1950s parked outside and workers in vintage clothing walking around the premises.&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&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="Photo: A 1950s-style Chernobyl nuclear power plant, with art deco architectural elements and large smokestacks. Cars from the 1950s parked outside and workers in vintage clothing walking around the premises." title="Photo: A 1950s-style Chernobyl nuclear power plant, with art deco architectural elements and large smokestacks. Cars from the 1950s parked outside and workers in vintage clothing walking around the premises." srcset="https://substackcdn.com/image/fetch/$s_!ViFR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04db467f-24d8-435d-85ad-441d281e4760_1024x1024.webp 424w, https://substackcdn.com/image/fetch/$s_!ViFR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04db467f-24d8-435d-85ad-441d281e4760_1024x1024.webp 848w, https://substackcdn.com/image/fetch/$s_!ViFR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04db467f-24d8-435d-85ad-441d281e4760_1024x1024.webp 1272w, https://substackcdn.com/image/fetch/$s_!ViFR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04db467f-24d8-435d-85ad-441d281e4760_1024x1024.webp 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 role="img" 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><title></title><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"></figcaption></figure></div><p></p><div><hr></div><p></p><h2>Content Recap</h2><p>Here&#8217;s an overview of my articles released in October on my blog - <a href="https://datawise.dev">Datawise</a>. </p><h3>SQL &#128240;</h3><ul><li><p><a href="https://datawise.dev/swapping-partitions-in-bigquery">Swapping partitions for faster and more seamless data processing</a> </p></li><li><p><a href="https://datawise.dev/write-better-sql-queries-faster-using-mock-data">Decomposing big SQL problems into smaller ones</a> </p></li><li><p><a href="https://datawise.dev/linting-bigquery-sql-with-sqlfluff">Using a linter with SQL</a></p></li><li><p><a href="https://datawise.dev/pay-attention-to-this-when-unnesting-in-bigquery">Inner / Cross Join and UNNEST</a></p></li><li><p><a href="https://datawise.dev/combining-structs-with-window-functions-in-bigquery">Use case for STRUCTs together with window functions</a></p></li><li><p><a href="https://datawise.dev/using-dynamic-sql-in-bigquery">Using dynamic SQL in BigQuery</a></p></li><li><p><a href="https://datawise.dev/using-bigquery-hashing-functions">Hashing functions in BigQuery: why, where, how</a></p></li><li><p><a href="https://datawise.dev/importing-google-sheets-into-bigquery">Moving data Google Sheets &#8594; BigQuery: a short walk-through</a></p></li><li><p><a href="https://datawise.dev/table-sampling-in-bigquery">Cheaper &amp; faster data exploration in BigQuery</a></p></li><li><p><a href="https://datawise.dev/picking-between-cte-view-and-temp-table-in-bigquery">What to pick between CTE, Views and Temp Tables</a></p></li><li><p><a href="https://datawise.dev/intersect-and-except-in-bigquery">Set operations: Intersect and BigQuery</a></p></li></ul><h3>Python</h3><ul><li><p><a href="https://datawise.dev/context-managers-in-python">What are context managers and why they are important</a></p></li></ul><p></p><div><hr></div><p></p><h2>Not really about data</h2><p>Here are things not really related to data or tech, but that I enjoyed reading about in the last month:</p><ul><li><p><a href="https://en.wikipedia.org/wiki/Silbo_Gomero">Silbo Gomero</a> - a whistling language spoken (whistled) on La Gomera island of the Canaries</p></li><li><p><a href="https://en.wikipedia.org/wiki/Soundex">Soundex</a> - a phonetic way of indexing names by their sounding in English</p></li><li><p><a href="https://en.wikipedia.org/wiki/Soft_serve">Soft serve</a> - didn&#8217;t know this type of ice cream has its own name</p></li></ul>]]></content:encoded></item><item><title><![CDATA[A few thoughts about recent Python integration into Excel]]></title><description><![CDATA[The buzz is real!]]></description><link>https://www.notjustsql.com/p/a-few-thoughts-about-recent-python</link><guid isPermaLink="false">https://www.notjustsql.com/p/a-few-thoughts-about-recent-python</guid><dc:creator><![CDATA[Constantin Lungu]]></dc:creator><pubDate>Fri, 25 Aug 2023 14:15:00 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1538439907460-1596cafd4eff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxweXRob258ZW58MHx8fHwxNjk5MDI0MzY4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" 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="https://images.unsplash.com/photo-1538439907460-1596cafd4eff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxweXRob258ZW58MHx8fHwxNjk5MDI0MzY4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1538439907460-1596cafd4eff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxweXRob258ZW58MHx8fHwxNjk5MDI0MzY4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1538439907460-1596cafd4eff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxweXRob258ZW58MHx8fHwxNjk5MDI0MzY4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1538439907460-1596cafd4eff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxweXRob258ZW58MHx8fHwxNjk5MDI0MzY4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1538439907460-1596cafd4eff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxweXRob258ZW58MHx8fHwxNjk5MDI0MzY4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1538439907460-1596cafd4eff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxweXRob258ZW58MHx8fHwxNjk5MDI0MzY4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="5854" height="3967" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1538439907460-1596cafd4eff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxweXRob258ZW58MHx8fHwxNjk5MDI0MzY4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3967,&quot;width&quot;:5854,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;green viper&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&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="green viper" title="green viper" srcset="https://images.unsplash.com/photo-1538439907460-1596cafd4eff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxweXRob258ZW58MHx8fHwxNjk5MDI0MzY4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1538439907460-1596cafd4eff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxweXRob258ZW58MHx8fHwxNjk5MDI0MzY4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1538439907460-1596cafd4eff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxweXRob258ZW58MHx8fHwxNjk5MDI0MzY4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1538439907460-1596cafd4eff?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw0fHxweXRob258ZW58MHx8fHwxNjk5MDI0MzY4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 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 role="img" 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><title></title><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 buzz is real! Excel now integrates with Python, and it's making waves.</p><p>I've started my Analytics path with Excel. I plan trips and manage my finances with it. At work, to this day, I'm falling back to it when other tools fail, so I welcome this update with open arms.</p><p>Here's why:</p><p>- This introduces a vast array of capabilities to Excel users. Think specialized data processing, visualization, machine learning, automation, and the list goes on.</p><p>- This move could revolutionize Data Analytics and potentially even Software Engineering by unveiling new horizons for individuals doing this kind of work already, but not necessarily explicitly having it in their role titles.<br>Imagine, even if a fraction of the Excel power users harness this, we&#8217;re ushering millions into the Python community. Exciting times ahead!</p><p>- Perhaps, this could be the curtain call for VBA scripting, which, let's face it, was never a favorite of mine.</p><p>But, a word of caution is in order:</p><p>- As the famous saying goes, "With great power comes great responsibility." Organizations and educators must spearhead best practices, especially concerning security, maintainability, and validation. Mistakes in spreadsheets have caused chaos before; let's double down on checks and balances.</p><p>- There might be an inclination to bypass conventional Software Engineering/Data Analytics channels, thinking, "We can manage in Excel now." But let's be judicious in our tool selection. We shouldn't revert to those dark days of endless tabs driven by opaque macros (with shady VBA, written a decade ago, that no one knows how it works anymore) - the ones where you're advised, "Just click this, and it works."</p><p>Python to the people!</p>]]></content:encoded></item><item><title><![CDATA[How a pet project can supercharge your developer career]]></title><description><![CDATA[Ever wondered how to deepen your understanding of programming and bridge the gap between theoretical knowledge and real-world application?]]></description><link>https://www.notjustsql.com/p/how-a-pet-project-can-supercharge-your-career</link><guid isPermaLink="false">https://www.notjustsql.com/p/how-a-pet-project-can-supercharge-your-career</guid><dc:creator><![CDATA[Constantin Lungu]]></dc:creator><pubDate>Tue, 15 Aug 2023 14:22:00 GMT</pubDate><enclosure url="https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxzdHVkeSUyMGxhcHRvcHxlbnwwfHx8fDE2OTkwMjQ4NTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxzdHVkeSUyMGxhcHRvcHxlbnwwfHx8fDE2OTkwMjQ4NTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxzdHVkeSUyMGxhcHRvcHxlbnwwfHx8fDE2OTkwMjQ4NTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxzdHVkeSUyMGxhcHRvcHxlbnwwfHx8fDE2OTkwMjQ4NTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxzdHVkeSUyMGxhcHRvcHxlbnwwfHx8fDE2OTkwMjQ4NTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxzdHVkeSUyMGxhcHRvcHxlbnwwfHx8fDE2OTkwMjQ4NTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1456w" sizes="100vw"><img src="https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxzdHVkeSUyMGxhcHRvcHxlbnwwfHx8fDE2OTkwMjQ4NTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080" width="4032" height="3024" data-attrs="{&quot;src&quot;:&quot;https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxzdHVkeSUyMGxhcHRvcHxlbnwwfHx8fDE2OTkwMjQ4NTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3024,&quot;width&quot;:4032,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;macbook pro on white wooden desk&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpg&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="macbook pro on white wooden desk" title="macbook pro on white wooden desk" srcset="https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxzdHVkeSUyMGxhcHRvcHxlbnwwfHx8fDE2OTkwMjQ4NTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 424w, https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxzdHVkeSUyMGxhcHRvcHxlbnwwfHx8fDE2OTkwMjQ4NTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 848w, https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxzdHVkeSUyMGxhcHRvcHxlbnwwfHx8fDE2OTkwMjQ4NTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 1272w, https://images.unsplash.com/photo-1616400619175-5beda3a17896?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wzMDAzMzh8MHwxfHNlYXJjaHw2fHxzdHVkeSUyMGxhcHRvcHxlbnwwfHx8fDE2OTkwMjQ4NTh8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=1080 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 role="img" 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><title></title><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">Photo by <a href="https://unsplash.com/@imkirk">Iewek Gnos</a> on <a href="https://unsplash.com">Unsplash</a></figcaption></figure></div><p>Ever wondered how to deepen your understanding of programming and bridge the gap between theoretical knowledge and real-world application? Consider starting a pet project!</p><p><strong>Story time</strong></p><p>Several years ago I was working in a Business Intelligence specialist role, transitioning from previously working with Excel only as a freshly minted graduate with a Finance Bachelor degree. First, it was building dashboards in Domo, a cloud BI tool with some simple SQL-based transformations. Then came a long trial-and-error and learning-by-doing (at work) journey to learn SQL.</p><p>I then understood that to progress I'd need to get myself familiar with a programming language. I chose Python and did so by following a Coursera course named 'Python for Everybody' (University of Michigan/Charles Severance). Data types, variables, control flow - I explored the language bit by bit and tried to code all the assignments.</p><p>Next, by the time I was getting a grasp of the basic things, I knew I'd like to do more - but there was no way I could get a job in data with my skill set. So I've decided to work on pet projects.</p><p>I was interested in Python and Web Development, so I decided to work on Content Management System (CMS), simply put, a blogging platform. My choice naturally fell on Flask - a lightweight and very popular Python web framework. I spent countless hours trying to get it off the ground, studying how other projects work, what are the best practices in the industry and simply trying to introduce a new feature.</p><p>While the project is nothing special in itself, akin to thousands of other hobby projects, here are just a couple of things I've learned about - most of them from scratch:</p><ul><li><p>git version control</p></li><li><p>what is Docker and why do we need it, as well as orchestrating with Docker-Compose</p></li><li><p>working with ORM (SqlAlchemy)</p></li><li><p>working with Celery (task queue) and Redis</p></li><li><p>code linting with Pylint</p></li><li><p>jinja templating (which Flask uses) - I use this to this day (in Dataform/dbt)</p></li><li><p>unit testing with pytest</p></li><li><p>integration testing with a headless browser on Selenium (Splinter)</p></li><li><p>basic HTML, CSS (Bootstrap) and Javascript</p></li><li><p>a simple CI that would run unit and integration tests on each commit</p></li></ul><p>Now, I might have barely scratched the surface of the above, and some of them might have been taught in a Computer Science Undergraduate program, but for someone with no formal programming acumen, even knowing what these things are and when should we use them was an absolute win. I felt that it gave me a basic understanding of very important things in every developer's toolbox.</p><p>&#128273; Here are six reasons why you should start a pet project:</p><p>1&#65039;&#8419; <strong>Learning by Doing Boosts Problem-Solving Skills</strong>: You learn about concepts when you encounter genuine problems and find solutions, reinforcing your learning. You learn how to debug, simulate, emit hypotheses and prove them right or wrong.</p><p>2&#65039;&#8419; <strong>Explore Your Passion</strong>: The pet project allows you to work on something YOU care about. It's more motivating to solve challenges when you're invested in the outcome. After all, you can build WHATEVER you want.</p><p>3&#65039;&#8419; <strong>Expand Your Tech Stack</strong>: Waiting to get the chance to work with some technology you are interested in can take forever, or it can never happen. With you in the driver's seat, you can explore on your own and dive into unfamiliar technologies and tools.</p><p>4&#65039;&#8419; <strong>Portfolio Building</strong>: A finished project shows potential employers tangible proof of your skills, but also consistency, determination and technical curiosity.</p><p>5&#65039;&#8419; <strong>Feedback and Iteration</strong>: Sharing your project with friends or the developer community can provide invaluable feedback. This iterative process of improving based on feedback is the essence of software development.</p><p>6&#65039;&#8419; <strong>Ownership and Responsibility</strong>: Owning a project from start to finish gives a sense of responsibility. This can mirror the real-world experience of leading a project at a job.</p><p>In essence, while books and tutorials offer foundational knowledge, diving headfirst into a pet project can supercharge your learning journey. Whatever your dream project is &#8211; an app, website, or game &#8211; dive in!</p><p>Remember: even if your creation isn't the next tech sensation, the skills you gain and the confidence you build is an unparalleled investment in yourself. Dive in, and let your creativity flow! &#127754;</p>]]></content:encoded></item></channel></rss>