SQL (ANSI)ProgrammatieSQL-ontwikkelaar / Data Engineer

Prescribe the ANSI SQL-windowfunctie techniek voor het isoleren van de minimale geordende subset van records waarvan de cumulatieve bijdrage 80% van een totaal vertegenwoordigt.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord op de vraag

Het Pareto-principe kwam voort uit de observaties van Vilfredo Pareto met betrekking tot grondbezit in Italië, en werd later een hoeksteen van kwaliteitscontrole en voorraadbeheer door het werk van Joseph Juran. In relationele databases vertaalt dit zich naar de behoefte aan ABC-analyse, waarbij analisten de kritische minderheid van records moeten identificeren die de meerderheid van de bedrijfswaarde aandrijven zonder gebruik te maken van externe statistische tools.

Het probleem vereist het berekenen van een lopende percentage van een in aflopende volgorde geplaatste metriek ten opzichte van het absolute totaal, waarna wordt afgesneden bij de 80%-grens. Omdat ANSI SQL werkt met sets in plaats van iteratieve cursors, bieden vensterfuncties het declaratieve mechanisme. De oplossing maakt gebruik van een cumulatieve som die over de gehele resultset is partitioneerd, geordend op waarde in aflopende volgorde, en deelt vervolgens door het totale bedrag binnen dezelfde rijcontext om een percentielrang te verkrijgen.

Kritisch is de frame-specificatie ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, die zorgt voor deterministische accumulatie rij-voor-rij. Als strikte behandeling van gelijke waarden noodzakelijk is—waarbij alle records die de grenswaarde delen als een eenheid moeten worden opgenomen of uitgesloten—zou RANGE ROWS vervangen. De finale filtering moet plaatsvinden in een outer query, aangezien vensterfuncties logisch worden berekend na de WHERE-clausule.

WITH ranked_products AS ( SELECT product_id, product_name, annual_revenue, SUM(annual_revenue) OVER ( ORDER BY annual_revenue DESC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS cumulative_revenue, SUM(annual_revenue) OVER () AS total_revenue FROM inventory ), pareto_subset AS ( SELECT product_id, product_name, annual_revenue, CAST(cumulative_revenue AS DECIMAL) / total_revenue AS cumulative_pct FROM ranked_products ) SELECT product_id, product_name, annual_revenue, cumulative_pct FROM pareto_subset WHERE cumulative_pct <= 0.80;

Situatie uit het leven

Een nationale elektronicawinkel kreeg te maken met stijgende kosten tijdens kwartaalvoorraadcontroles, wat inhield dat de isolatie van hoogwaarde SKUs die 80% van het totale magazijnkapitaal ($50 miljoen over 40.000 artikelen) vertegenwoordigden, noodzakelijk was om prioriteit te geven aan cyclische telling.

Oplossing 1: Spreadsheet-extractie hield in dat analisten CSV-bestanden exporteerden naar Excel, sorteerden op kosten per eenheid en handmatig optelden tot de drempel was bereikt. Voordelen vereisten geen ontwikkelingstijd. Nadelen omvatten applicatiecrashes met grote datasets, uurregistratievereisten en voorkeurspreventie in realtime-integratie met het magazijnbeheersystem.

Oplossing 2: Berekening op applicatieniveau gebruikte een Python-script dat rijen stroomde en een lopende accumulator bijhield. Voordelen boden flexibele logica en gemakkelijke debugging. Nadelen introduceerden significante netwerkvertraging bij het overdragen van miljoenen rijen, single-threaded uitvoering blokkeerde het analytics-dashboard en geheugenbeperkingen op de klantmachine.

Oplossing 3: ANSI SQL Set-Based Aanpak implementeerde de vensterfunctiequery direct binnen het PostgreSQL-magazijn. Voordelen omvatten milliseconden-latentie, eliminatie van databeweging en automatische vernieuwing met nachtelijke updates. Nadelen vereisten geavanceerde SQL-kennis voor onderhoud.

Gekozen oplossing en resultaat: Oplossing 3 werd ingezet als een view, waarbij bleek dat slechts 12% van de SKUs verantwoordelijk was voor 80% van de waarde. De auditomvang werd met 88% verminderd, wat 340 arbeidsuren per kwartaal bespaarde terwijl de volledige dekking van materiële waarde behouden bleef.

Wat kandidaten vaak missen


Hoe beïnvloedt de keuze tussen ROWS en RANGE frame-specificaties de 80% grens wanneer er dubbele waarden bestaan?

RANGE behandelt gelijke rijen met identieke ORDER BY-waarden als een enkele groep; als de 80%-grens binnen een gelijke waarde valt, omvat RANGE de gehele groep, wat mogelijk boven de 80% uitkomt. ROWS verwerkt fysieke offsets ongeacht gelijke waarden, wat een logische bedrijfsunit kan splitsen. Kandidaten missen vaak dat ANSI SQL expliciete afstemming van dit gedrag toestaat; voor financiële rapportage zorgt RANGE ervoor dat consistente perioden niet worden gesplitst, terwijl ROWS fijnere granulariteit biedt voor onderscheidende items.


Waarom moet de cumulatieve percentageberekening in een afgeleide tabel of CTE worden uitgevoerd en niet rechtstreeks in de WHERE-clausule?

Vensterfuncties worden logisch geëvalueerd tijdens de SELECT fase, die plaatsvindt na de filtering van rijen door de WHERE-clausule. Proberen te filteren op cumulative_revenue / total_revenue <= 0.8 direct in WHERE veroorzaakt een syntaxisfout omdat de vensterresultaat nog niet is gematerialiseerd. Kandidaten hebben vaak moeite met de logische verwerkingsvolgorde van ANSI SQL: FROMWHEREGROUP BYHAVINGWINDOWSELECTORDER BY. De oplossing vereist nesting om de vensterfunctie in een inner query te berekenen, en vervolgens de resulterende kolom in een outer query te filteren.


Hoe zou je deze query optimaliseren als de inventaris tabel miljarden rijen bevat en de 80% subset naar verwachting zeer klein is?

Kandidaten missen vaak het Top-N optimalisatiepatroon. In plaats van een vensterfunctie over de gehele tabel te berekenen, kan een voorlopige filter met een subquery met DENSE_RANK() of NTILE() helpen om de vensterberekening te beperken tot de meest significante kandidaten. Alternatief kan het gebruik van PARTITION BY als de analyse segmenten per categorie voorkomt, volledige tabelscans voorkomen. Begrijpen dat vensterfuncties een sorteeroperatie afdwingen, en dat indexeren op de omzetkolom in aflopende volgorde de sorteer kosten kan elimineren, is cruciaal voor schaal.