דירוג שורות בלי פונקצית חלון

דירוג שורות בתוך קבוצה בלי שימוש בפונקצית חלון

מתקדם
Published

October 3, 2023

ברוכים הבאים לתרגיל השלישי!

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

תכלס, ברוב המקרים תוכלו להשתמש בפונקצית חלון, אבל נראה לי זה תרגול מגניב שדורש מאיתנו לחשוב מה בפועל קורה בפונקצית דירוג ובכך לשחזר אותה.

שאלה

ללא שימוש בשום פונקצית חלון, צרו עמודה חדשה שמדרגת את השורות לפי מכירות (amount) באותה שנה (sale_year), בדומה לפונקצית DESNE_RANK(). כלומר, בהינתן תיקו בהיררכיה, ערכים זהים יקבלו את אותו דירוג ואילו הערכים הבאים בסדר יקבלו דירוג אחד מעל הערך הקודם שהיה בתיקו.

בהצלחה!

נסו בעצמכם

אונליין

נסו בחלון טקסט למטה (SQLite):

-- EDIT THIS QUERY:
SELECT *
FROM sales_ag
LIMIT 10;

נסו על המחשב שלכם

הצג קוד ליצירת טבלה
DROP TABLE IF EXISTS Sales_ag;

CREATE TABLE sales_ag (
    year INT,
    category varchar(15),
    amount INT
)


INSERT into Sales_ag (year, category, amount) values (2000, 'Automotive', 89);
insert into Sales_ag (year, category, amount) values (2000, 'Computers', 59);
insert into Sales_ag (year, category, amount) values (2000, 'Books', 19);
insert into Sales_ag (year, category, amount) values (2000, 'Movies', 74);
insert into Sales_ag (year, category, amount) values (2000, 'Garden', 74);
insert into Sales_ag (year, category, amount) values (2001, 'Clothing', 49);
insert into Sales_ag (year, category, amount) values (2001, 'Computers', 53);
insert into Sales_ag (year, category, amount) values (2001, 'Automotive', 65);
insert into Sales_ag (year, category, amount) values (2001, 'Garden', 24);
insert into Sales_ag (year, category, amount) values (2001, 'Movies', 39);

תשובה

סרטון הסבר

הצג פתרון
SELECT *,
    (SELECT COUNT(DISTINCT SalesInner.amount) as rn
    FROM sales_ag SalesInner
    WHERE SalesInner.year = SalesOuter.year
        AND SalesInner.amount >= SalesOuter.amount)  AS custom_dense_rank
FROM sales_ag SalesOuter
ORDER BY year, custom_dense_rank
custom_dense_rank amount category sale_year
1 89 Automotive 2000
2 74 Movies 2000
2 74 Garden 2000
3 59 Computers 2000
4 19 Books 2000
1 65 Automotive 2001
2 53 Computers 2001
3 49 Clothing 2001
4 39 Movies 2001
5 24 Garden 2001