ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 7 · 4లో పాఠం 3కోర్సులో 27/57~12 min
మాడ్యూల్ పాఠాలు (3/4)

లాగ్, లీడ్ మరియు రన్నింగ్ మొత్తాలు

LAG మరియు LEAD అనేవి రెండు ప్రత్యేక విండో ఫంక్షన్‌లు మీకు యాక్సెస్‌ని అందిస్తాయి అదే విభజన యొక్క ఇతర అడ్డు వరుసలు: మునుపటి అడ్డు వరుస (LAG) లేదా విండో ORDER BY ప్రకారం తదుపరిది (LEAD). వారు ది గో-టు టూల్ వరుస నుండి వరుస పోలికలు (డెల్టాలు, వైవిధ్యాలు, విరామాలు) మరియు — SUM/AVG/COUNT OVERతో కలిపి — రన్నింగ్ మొత్తాలకు.

LAG: మునుపటి వరుస

SQL
LAG(colonna)            OVER (PARTITION BY p ORDER BY o)
LAG(colonna, n)         OVER (PARTITION BY p ORDER BY o)   -- n righe indietro
LAG(colonna, n, default) OVER (PARTITION BY p ORDER BY o)  -- default se non c'è

ఉదాహరణ: ప్రతి ఆర్డర్ కోసం, "మునుపటి ఆర్డర్ నుండి అదే విధంగా రోజులు కస్టమర్":

SQL
SELECT id,
       customer_id,
       ordered_at,
       ordered_at - LAG(ordered_at) OVER (
         PARTITION BY customer_id ORDER BY ordered_at
       ) AS since_previous_order
FROM   orders
ORDER BY customer_id, ordered_at;

ప్రతి కస్టమర్ యొక్క మొదటి ఆర్డర్ since_previous_order = NULL ఎందుకంటే విభజనలో "మునుపటి" లేదు.

లీడ్: తదుపరి వరుస

LAG యొక్క అద్దం. విలక్షణమైనది: "తదుపరి ఈవెంట్ వరకు సమయం", "తేడా తదుపరి సంస్కరణతో".

SQL
SELECT id, ordered_at,
       LEAD(ordered_at) OVER (PARTITION BY customer_id ORDER BY ordered_at)
         - ordered_at AS to_next
FROM   orders;

అమలవుతున్న మొత్తాలు: ఓవర్‌తో కూడిన మొత్తం

మొత్తం ఫంక్షన్‌లు (SUM, AVG, COUNT, MAX, MIN) అవుతాయి సంచిత OVER (… ORDER BY …)తో కలిపినప్పుడు:

SQL
SELECT order_id,
       total,
       SUM(total) OVER (
         PARTITION BY customer_id
         ORDER BY     ordered_at
       ) AS running_total
FROM   …;

ప్రతి అడ్డు వరుస కోసం, SUM విభజనలోని అన్ని అడ్డు వరుసల మొత్తాన్ని గణిస్తుంది ఆ పాయింట్, విండో ORDER BY ప్రకారం. ఫలితం క్లాసిక్ "రన్నింగ్ బ్యాలెన్స్".

దీనిని ప్రయత్నించండి

వ్యాయామం#sql.m7.l3.e1
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

ప్రతి ఆర్డర్ కోసం id, customer_id, order_at మరియు ఒక days_from_previous నిలువు వరుసను చూపుతుంది, ఇది ఆర్డర్_at ద్వారా ఆర్డర్ చేయబడిన ప్రస్తుత ఆర్డర్ మరియు మునుపటి అదే కస్టమర్‌కు మధ్య ఉన్న మొత్తం రోజుల సంఖ్య (FLOORతో). మునుపటి ఆర్డర్ లేకపోతే NULL. customer_id ద్వారా ఆర్డర్ చేయండి మరియు order_at.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

LAG(ordered_at) OVER (PARTITION by customer_id ORDER BY order_at) కస్టమర్ యొక్క మునుపటి ఆర్డర్ టైమ్‌స్టాంప్‌ను అందిస్తుంది. INTERVALని పొందడానికి తీసివేయండి, ఆపై రోజులకు మార్చండి.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది

వ్యాయామం సమీక్షించండి

వ్యాయామం#sql.m7.l3.e2
ప్రయత్నాలు: 0లోడ్ అవుతోంది...

డెలివరీ చేయబడిన ప్రతి ఆర్డర్ కోసం (స్టేటస్ = 'డెలివరీ చేయబడినది'), id, customer_id, order_at, order_total (పరిమాణం మొత్తం * యూనిట్_ప్రైస్ దాని లైన్ ఐటెమ్‌లు) మరియు రన్నింగ్_టోటల్ (కస్టమర్‌కి మొత్తం అమలవుతున్న మొత్తం, order_at ద్వారా ఆర్డర్ చేయబడింది) చూపండి. ఆర్డర్_మొత్తం కోసం CTEని ఉపయోగించండి. customer_id ద్వారా ఆర్డర్ చేయండి మరియు order_at.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

CTE మొత్తం ఆర్డర్‌ను గణిస్తుంది; SUM OVER కాలక్రమేణా ఒక్కో కస్టమర్‌కు అమలవుతున్న మొత్తాన్ని ఉత్పత్తి చేస్తుంది.

3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది