Jaksojen välinen muutos
Laske kuukausi- ja päiväkohtaiset muutokset LAG-funktiolla
Jaksojen välinen muutos on ilmainen SQL-työhaastatteluun valmistautuminen-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu SQL-työhaastatteluun valmistautuminen-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL-työhaastatteluun valmistautuminen-kurssilla on yhteensä 4 oppituntia.
Analyytikon varma haastattelukysymys
Jos haette data-analyytikon tehtävää, varautukaa kysymyksiin: "Laske kuukausikasvu edelliseen kuukauteen verrattuna" tai "Mikä on päivittäinen muutos edelliseen päivään verrattuna?" Tällaiselta kysymykseltä on lähes mahdotonta välttyä.
Perusta on LAG: hakekaa edellisen jakson arvo ja laskekaa sen jälkeen absoluuttinen erotus tai prosentuaalinen muutos. Tässä oppitunnissa opitte jaksottaisen vertailun mallit, joiden hallintaa haastattelijat arvioivat LAG-funktion avulla.
Absoluuttinen muutos LAG-funktiolla
Yksinkertaisin versio on tämän jakson ja edellisen jakson välinen suora erotus. Hakekaa edellinen arvo LAG-funktiolla ja vähentäkää se suoraan lausekkeessa.
Ensimmäisellä järjestetyllä rivillä ei ole edeltäjää, joten sen muutos on NULL. Se on oikein, ei virhe: vertailtavaa edellistä jaksoa ei todellisuudessa ole.
SELECT
month,
revenue,
revenue - LAG(revenue) OVER (ORDER BY month) AS mom_change
FROM monthly_sales
ORDER BY month;Prosentuaalinen muutos
Haastattelijat haluavat yleensä kasvun prosentteina. Kaava on (nykyinen - edellinen) / edellinen kerrottuna sadalla. Ilmaiskaa se suoraan LAG-funktion avulla.
Kiinnittäkää huomiota laskutoimitusten järjestykseen ja sulkeisiin; väärään kohtaan sijoitettu sulje on paineen alla tehtävä klassinen virhe.
SELECT
month,
revenue,
100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
/ LAG(revenue) OVER (ORDER BY month) AS pct_growth
FROM monthly_sales
ORDER BY month;Välttäkää kokonaislukujakoa
Monet hakijat kompastuvat seuraavaan: jos revenue on kokonaisluku, (110 - 100) / 100 saa arvon 0 kokonaislukujakoa käyttävissä tietokannoissa.
Kertokaa tulos luvulla 100.0 (liukulukunumerolla) tai muuntakaa se ensin desimaaliksi CAST-funktiolla, jotta laskenta pakotetaan liukulukulaskennaksi. Tämän mainitseminen oma-aloitteisesti osoittaa tarkkuutta.
SELECT
month,
ROUND(
100.0 * (revenue - LAG(revenue) OVER (ORDER BY month))
/ LAG(revenue) OVER (ORDER BY month), 2
) AS pct_growth
FROM monthly_sales;Selkeämpi tapa: laskekaa kerran CTE:ssä
LAG-funktion kutsuminen kahdesti (osoittajaa ja nimittäjää varten) on toisteista ja siinä on helppo tehdä kirjoitusvirhe. Yleinen uudelleenjärjestelytapa on laskea edellinen arvo kerran CTE:ssä ja tehdä laskutoimitus ulommassa kyselyssä.
Tämä on selkeämpi ratkaisu valkotauluhaastattelussa ja estää kahden LAG-kutsun välisten erojen syntymisen.
WITH t AS (
SELECT
month,
revenue,
LAG(revenue) OVER (ORDER BY month) AS prev
FROM monthly_sales
)
SELECT
month,
revenue,
ROUND(100.0 * (revenue - prev) / prev, 2) AS pct_growth
FROM t;Suojautukaa nollalla jakamiselta
Jos edellisen jakson arvo voi olla 0, prosenttikaava jakaa nollalla ja aiheuttaa virheen. Käyttäkää NULLIF(prev, 0)-funktiota, jolloin nimittäjästä tulee NULL ja tulokseksi saadaan poikkeuksen sijaan NULL.
Varautuminen nollalla jakamiseen on pieni yksityiskohta, jonka haastattelijat huomaavat tuotantokäyttöä ajattelevissa hakijoissa.
SELECT
month,
revenue,
100.0 * (revenue - prev) / NULLIF(prev, 0) AS pct_growth
FROM (
SELECT month, revenue,
LAG(revenue) OVER (ORDER BY month) AS prev
FROM monthly_sales
) s;Ryhmäkohtainen jaksovertailu
Useimmat todelliset kysymykset rajataan tiettyyn kohteeseen: kuukausikasvu tuotekohtaisesti tai aluekohtaisesti. Lisätkää PARTITION BY, jotta kunkin ryhmän aikasarjaa verrataan vain siihen itseensä.
Kunkin ryhmän ensimmäinen kuukausi saa arvon NULL, eikä vertailua tehdä koskaan tuoteryhmien rajojen yli.
SELECT
product_id,
month,
revenue,
revenue - LAG(revenue) OVER (
PARTITION BY product_id
ORDER BY month
) AS mom_change
FROM product_sales;Vuosivertailu offsetilla
Kun kuukausittaisissa tiedoissa rivit ovat kuukauden välein, vuosittaista muutosta varten verrataan arvoon, joka on 12 riviä aiemmin. Offset-argumentti tekee tämän suoraan: LAG(revenue, 12).
Tämä edellyttää, että joka kuukaudelta on yksi rivi eikä välistä puutu kuukausia. Jos kuukausia voi puuttua, vertaisitte sen sijaan täsmällisen päivämäärän perusteella, esimerkiksi yhdistämällä taulut päivämäärän mukaan. Tämä on hienovarainen yksityiskohta, joka kannattaa mainita ääneen.
SELECT
month,
revenue,
revenue - LAG(revenue, 12) OVER (ORDER BY month) AS yoy_change
FROM monthly_sales
ORDER BY month;Koostakaa tiedot ennen vertailua
Raakatapahtumatauluja ei ole valmiiksi summattu kuukausittain. Realistisessa ratkaisussa tiedot kootaan ensin yhdeksi riviksi jaksoa kohden, minkä jälkeen koostettuun tulokseen käytetään LAG-funktiota, yleensä CTE:n kautta.
Jos käytätte LAG-funktiota koostamattomiin riveihin, vertaatte yksittäisiä tapahtumia kuukausisummien sijaan. Tämä on yleinen looginen virhe.
WITH monthly AS (
SELECT DATE_TRUNC('month', order_date) AS mth,
SUM(amount) AS revenue
FROM orders
GROUP BY 1
)
SELECT mth, revenue,
revenue - LAG(revenue) OVER (ORDER BY mth) AS mom_change
FROM monthly
ORDER BY mth;Ensimmäisen NULL-arvon tulkinta
Haastattelijat kysyvät joskus: "Miksi ensimmäisen rivinne kasvu on NULL, ja hyväksyttekö sen?" Oikea vastaus on, että edellistä jaksoa ei ole, joten muutos on määrittelemätön ja NULL kuvaa tätä oikein.
Jos liiketoiminta vaatii sen sijaan arvon 0, käyttäisitte LAG(revenue, 1, 0)-funktiota tai COALESCE-funktiota, mutta vain jos se vastaa tarkoitettua merkitystä.
Kasvusuunnan nimeäminen
Haastattelijat laajentavat kysymystä joskus näin: "Merkitkää myös, kasvoiko, supistuiko vai pysyikö kukin kuukausi ennallaan." Käärikää LAG-vertailu CASE-lausekkeeseen.
Edelliseen arvoon vertaaminen tuottaa numeerisen erotuksen lisäksi selkeän ja ihmiselle luettavan trendisarakkeen. Ensimmäiselle vertailukohdetta vailla olevalle jaksolle voidaan näyttää vaivatta NULL tai oletusmerkintä.
SELECT
month,
revenue,
CASE
WHEN revenue > LAG(revenue) OVER (ORDER BY month) THEN 'up'
WHEN revenue < LAG(revenue) OVER (ORDER BY month) THEN 'down'
ELSE 'flat'
END AS trend
FROM monthly_sales
ORDER BY month;Pikatarkistus
Havaitkaa prosentuaalisen muutoksen kyselyiden yleinen virhe.
Kertaus
Jaksojen välinen muutos muodostuu LAG-funktiosta ja laskutoimituksesta:
- Absoluuttinen muutos:
value - LAG(value) OVER (ORDER BY period). - Prosentuaalinen muutos:
100.0 * (value - prev) / NULLIF(prev, 0). - Pakottakaa laskenta liukuluvuiksi, estäkää nollalla jakaminen ja koostakaa tiedot yhdeksi riviksi jaksoa kohden.
- Rajauksessa käytetään
PARTITION BY-lauseketta; vuosivertailussa käytetään offsetia.
Seuraavaksi jaamme rivit ryhmiin ja tasoihin NTILE-funktiolla.
Opi SQL tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 30
- Oppitunnit
- 120
Usein kysytyt kysymykset
Onko oppitunti ”Jaksojen välinen muutos” ilmainen?
Kyllä – oppitunnin ”Jaksojen välinen muutos” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko SQL-työhaastatteluun valmistautuminen-kurssin, päivitä CoddyKit PROhon. SQL-työhaastatteluun valmistautuminen-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Jaksojen välinen muutos”?
Laske kuukausi- ja päiväkohtaiset muutokset LAG-funktiolla Harjoittelet SQL-työhaastatteluun valmistautuminen-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni SQL-työhaastatteluun valmistautuminen-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin SQL-työhaastatteluun valmistautuminen-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Jaksojen välinen muutos”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä SQL-työhaastatteluun valmistautuminen-oppitunnilla?
Kyllä. Jokainen SQL-työhaastatteluun valmistautuminen-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- LAG ja LEAD vierekkäisille riveille
- Jaksojen välinen muutos
- NTILE luokitteluun
- FIRST_VALUE, LAST_VALUE ja kehysten reunat