תרגול שפת SQL מספר 1036 – הלקוחות שקנו ביום העמוס בשנה​

תרגיל זה הוא ברמת קושי קשה ומתרגל אלמנטים של subqueries, join, windows function בשפת SQL.
תרגיל מסוג זה יכול להופיע בראיונות עבודה לתפקיד של דאטה אנליסט.

התרגיל נכתב ע"י יובל מרנין.
לעמוד התרגילים המלא לחצו כאן.

לפניך חלק מטבלת orders מתוך דאטה-בייס בשם e_commerce

טבלת Orders

order_time_stamporder_dateorder_date_houravg_unit_pricesum_orderitem_orderscountrycustomer_idorder_id
2010-12-01 08:35:002010-12-0112/1/2010 8:355.949999809317.84999942781United Kingdom13,047536369
2010-12-01 08:45:002010-12-0112/1/2010 8:452.764500013855.860005855620France12,583536370
2010-12-01 09:00:002010-12-0112/1/2010 9:002.5499999523203.99999618531United Kingdom13,748536371
2010-12-01 09:01:002010-12-0112/1/2010 9:011.850000023822.20000028612United Kingdom17,850536372
2010-12-01 09:02:002010-12-0112/1/2010 9:023.3193749636259.859997272516United Kingdom17,850536373
2010-12-01 09:09:002010-12-0112/1/2010 9:0910.9499998093350.39999389651United Kingdom15,100536374
2010-12-01 09:32:002010-12-0112/1/2010 9:323.3193749636259.859997272516United Kingdom17,850536375
2010-12-01 09:32:002010-12-0112/1/2010 9:323328.79999923712United Kingdom15,291536376
2010-12-01 09:34:002010-12-0112/1/2010 9:341.850000023822.20000028612United Kingdom17,850536377
2010-12-01 09:37:002010-12-0112/1/2010 9:371.7552631701444.980001211219United Kingdom14,688536378
2010-12-01 09:41:002010-12-0112/1/2010 9:411.450000047734.80000114441United Kingdom17,809536380
2010-12-01 09:41:002010-12-0112/1/2010 9:412.5199999877449.979997038835United Kingdom15,311536381
2010-12-01 09:45:002010-12-0112/1/2010 9:455.9708333512430.600001096712United Kingdom16,098536382
2010-12-01 09:53:002010-12-0112/1/2010 9:534.7807691831489.599996089913United Kingdom18,074536384
2010-12-01 09:56:002010-12-0112/1/2010 9:565.5714286906130.85000157367United Kingdom17,420536385
2010-12-01 09:57:002010-12-0112/1/2010 9:572.7499999205508.19998836523United Kingdom16,029536386
2010-12-01 09:58:002010-12-0112/1/2010 9:582.65199995043,193.91996383675United Kingdom16,029536387
2010-12-01 09:59:002010-12-0112/1/2010 9:593.3764285211226.139998316814United Kingdom16,250536388
2010-12-01 10:03:002010-12-0112/1/2010 10:035.2785713673358.249995231614Australia12,431536389
2010-12-01 10:19:002010-12-0112/1/2010 10:192.45291666351,825.739990472824United Kingdom17,511536390
2010-12-01 10:29:002010-12-0112/1/2010 10:2918.398999989318.139999866510United Kingdom13,705536392
2010-12-01 10:37:002010-12-0112/1/2010 10:379.949999809379.59999847411United Kingdom13,747536393
2010-12-01 10:39:002010-12-0112/1/2010 10:392.18818179311,024.680003404611United Kingdom13,408536394
2010-12-01 10:47:002010-12-0112/1/2010 10:472.5707142821507.879993915614United Kingdom13,767536395
2010-12-01 10:51:002010-12-0112/1/2010 10:515.2116666238376.35999584218United Kingdom17,850536396
2010-12-01 10:51:002010-12-0112/1/2010 10:514.6500000954279.0000057222United Kingdom17,924536397

אנא כיתובו את השאילתות הבאות:

  1. מצאו את הלקוחות שהזמינו ביום עם מספר ההזמנות הכי גבוה בטבלת ההזמנות.
  2. מצאו את הלקוחות שהזמינו ביום עם מספר ההזמנות במקום השני הכי גבוה בטבלת ההזמנות.
בשביל פתרון והסבר אנא גללו למטה.

 

select

       distinct

       customer_id

from

       e_commerce.orders as orders

— start sub query orders_by_date_ranked_filtered —

inner join

(

       select

             *

       — start sub query orders_by_date_ranked —

       from

       (

             select

                    order_date,

                    orders,

                    rank () over (order by orders desc) as rk

             — start sub query orders_by_date —

             from

             (

                    select

                          order_date,

                          count(order_id) as orders

                    from

                          e_commerce.orders

                    group by

                          1

             ) as orders_by_date

             — end sub query orders_by_date —

       ) as  orders_by_date_ranked

       — end sub query orders_by_date_ranked —

       where

             orders_by_date_ranked.rk=1

) as orders_by_date_ranked_filtered

— end sub query orders_by_date_ranked_filtered —

on

   orders_by_date_ranked_filtered.order_date=orders.order_date

 

הסבר:

בשביל למצא את היום הכי משמעותי אנחנו מיצרים טבלה אגרגטיבית שבה לכל יום יש את כמות ההזמנות שלו. לאחר מכן, אנחנו מדרגים את הטבלה לפי כמות הזמנות.
לאחר הדרוג, אנחנו מפלטרים את התאריך שמדורג הכי גבוה בכמות ההזמנות (rk=1) ומחברים אותו ב inner join לטבלת ההזמנות הכללית.
בטבלת ההזמנות הכללית אנחנו בוחרים רק את הלקוחות, וכדי להימנע ממקרים כפולים (לקוחות שהזמינו פעמיים באותו היום) אנחנו משתמשים ב distinct.

עבור הסעיף השני בשאלה – יש לבחור rk=2 בשביל היום עם הכי הרבה הזמנות במקום השני. 

Yuval Marnin

לחברות המעוניינות בשירותי פרילנס או מנטורינג של אנליסט, ניתן לפנות אליי ל[email protected]