Valmistautuminen ohjelmointihaastatteluihin · Oppitunti

Jaksojen välinen muutos

Laske kuukausi- ja päiväkohtaiset muutokset LAG-funktiolla

Oppitunti 2/413 vaihetta

Jaksojen välinen muutos on ilmainen Valmistautuminen ohjelmointihaastatteluihin-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 Valmistautuminen ohjelmointihaastatteluihin-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Valmistautuminen ohjelmointihaastatteluihin-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.

Aloita maksutta

Opi Valmistautuminen ohjelmointihaastatteluihin 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
90
Oppitunnit
360

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 Valmistautuminen ohjelmointihaastatteluihin-kurssin, päivitä CoddyKit PROhon. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Jaksojen välinen muutos”?

Laske kuukausi- ja päiväkohtaiset muutokset LAG-funktiolla Harjoittelet Valmistautuminen ohjelmointihaastatteluihin-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Valmistautuminen ohjelmointihaastatteluihin-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Valmistautuminen ohjelmointihaastatteluihin-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ä Valmistautuminen ohjelmointihaastatteluihin-oppitunnilla?

Kyllä. Jokainen Valmistautuminen ohjelmointihaastatteluihin-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

  1. LAG ja LEAD vierekkäisille riveille
  2. Jaksojen välinen muutos
  3. NTILE luokitteluun
  4. FIRST_VALUE, LAST_VALUE ja kehysten reunat
← Takaisin: Valmistautuminen ohjelmointihaastatteluihin