יום רביעי, 14 במרץ 2012

מקבילה בקליקוויו ל-row_number() over (partition by

נניח שיש לי במערכת טבלת הזמנות, ולידה טבלת פעולות, שבה מתועדות הפעולות השונות שנעשו בהזמנה. למשל עבור הזמנה מסוימת: בתאריך א' ההזמנה התקבלה, בתאריך ב' היא עברה לגורם מטפל, ובתאריך ג' היא נסגרה.
אני מעוניין למספר כל פעולה בסדר עולה, לפי תאריך השלב, וכמובן - המספור צריך להתחיל מחדש עבור כל הזמנה.
באורקל ניתן לעשות זאת כך:
row_number()  over (partition by OrderID order by ActionDate) as ActionNum

האם ניתן לעשות גם בקליקויו? ובכן, כן. המומחה John Witherspoon פרסם כאן את הקוד הבא (בהתאמות לדוגמה שלנו):
left Join (Actions)
LOAD
       ActionID,
       if(OrderID<>previous(OrderID),1,peek('ActionNum')+1) as ActionNum
RESIDENT 
       ActionID
ORDER BY 
       OrderID, ActionDate
;
הסבר: הקוד ממיין את טבלת הפעולות לפי מספר הזמנה, ואח"כ לפי תאריך הפעולה. ע"פ המיון הזה הוא בודק האם ההזמנה הנוכחית שונה מהזמנה הקודמת. אם כן - כלומר אנחנו בפעולה הראשונה של ההזמנה, אזי יוגדר המספר 1. אחרת - כלומר אנחנו בפעולה השנייה והלאה, יוגדר המספר מהשורה הקודמת + 1.

אגב, ניתן להתקדם שלב נוסף, ועל בסיס השדה החדש ActionNum לחשב ערך מצטבר כלשהו. נניח שבטבלת פעולות ישנו שדה ActionCost אשר מכיל את העלות הכספית של כל פעולה, ואני מעוניין לחשב עלות מצטברת לאורך הפעולות (עבור כל הזמנה). אמנם בגרפים ניתן להשתמש ב-Accumulate, אבל למשל ב-Trellis זה לא עובד, וכמו"כ לפעמים נרצה להציג זאת באובייקט Tablebox שבו זה לא אפשרי.
ובכן, לאחר שיצרנו את השדה ActionNum, נוכל להוסיף את הקוד הבא:
left Join (Actions)
LOAD
       ActionID,
       ActionCost + if(ActionNum>1, Peek('AccCost',-1),0) as AccCost
RESIDENT 
       ActionID
ORDER BY 
       OrderID, ActionDate
;


אין תגובות:

הוסף רשומת תגובה