Κοινή χρήση μέσω


Κατανόηση των συναρτήσεων ORDERBY, PARTITIONBYandMATCHBYandMATCHBY

Οι ORDERBYσυναρτήσεις , PARTITIONBYandMATCHBY στο DAX είναι ειδικές συναρτήσεις που μπορούν να χρησιμοποιηθούν μόνο μαζί με DAXWindow συναρτήσεις: INDEX, OFFSET, WINDOW, RANK, ROWNUMBER.

Η κατανόηση ORDERBY, PARTITIONBY, andMATCHBY είναι σημαντική για την επιτυχή χρήση των συναρτήσεων Window. Τα παραδείγματα που παρέχονται εδώ χρησιμοποιούν OFFSET, αλλά ισχύουν παρόμοια με τις άλλες συναρτήσεις Window.

Σενάριο

Ας ξεκινήσουμε με ένα παράδειγμα που δεν χρησιμοποιεί συναρτήσεις Window στο all. Παρακάτω εμφανίζεται ένας πίνακας που επιστρέφει τις συνολικές πωλήσεις, ανά χρώμα, ανά calendaryear. Υπάρχουν πολλοί τρόποι για να define αυτόν τον πίνακα, αλλά δεδομένου ότι μας ενδιαφέρει να κατανοήσουμε τι συμβαίνει σε DAX, θα χρησιμοποιήσουμε έναν υπολογιζόμενο πίνακα. Αυτή είναι η παράσταση πίνακα:

BasicTable = 
    SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
    )

Θα δείτε ότι αυτή η παράσταση υπολογιζόμενου πίνακα χρησιμοποιεί SUMMARIZECOLUMNS για να calculate την SUM της στήλης SalesAmount στον πίνακα FactInternetSales, από τη στήλη Χρώμα από τον πίνακα DimProduct, and τη στήλη CalendarYear από τον πίνακα DimDate. Δείτε το αποτέλεσμα:

Χρώμα CalendarYear CurrentYearSales
"Μαύρο" 2017 393885
"Μαύρο" 2018 1818835
"Μαύρο" 2019 3981638
"Μαύρο" 2020 2644054
"Blue" 2019 994448
"Blue" 2020 1284648
"Πολλαπλών" 2019 48622
"Πολλαπλών" 2020 57849
"NA" 2019 207822
"NA" 2020 227295
"Red" 2017 2961198
"Red" 2018 3686935
"Red" 2019 900175
"Red" 2020 176022
"Ασημί" 2017 326399
"Ασημί" 2018 750026
"Ασημί" 2019 2165176
"Ασημί" 2020 1871788
"Λευκό" 2019 2517
"Λευκό" 2020 2589
"Yellow" 2018 163071
"Yellow" 2019 2072083
"Yellow" 2020 2621602

Now, ας φανταστούμε ότι προσπαθούμε να λύσουμε το επιχειρηματικό ζήτημα του υπολογισμού της διαφοράς στις πωλήσεις, yearyear για κάθε χρώμα. Στην πραγματικότητα, χρειαζόμαστε έναν τρόπο για να find πωλήσεων για το ίδιο χρώμα στη previousyearand αφαιρέσουμε από τις πωλήσεις στο τρέχον year, στο περιβάλλον. Για παράδειγμα, για τον συνδυασμό [Red, 2019] αναζητούμε πωλήσεις για [Red, 2018]. Μόλις αποκτήσουμε αυτό το στοιχείο, μπορούμε να το αφαιρέσουμε από τις τρέχουσες πωλήσεις and να επιστρέψουμε τις απαιτούμενες value.

Χρήση OFFSET

OFFSET είναι ιδανική για τις τυπικές συγκρίνετε με previous τους τύπους υπολογισμών που απαιτούνται για την απάντηση στην επιχειρηματική ερώτηση που περιγράφεται παραπάνω, καθώς μας επιτρέπει να κάνουμε μια σχετική κίνηση. Η first προσπάθειά μας μπορεί να είναι:

1stAttempt = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "PreviousColorSales",
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation
            ),
            [CurrentYearSales]
        )
    )

Πολλά συμβαίνουν με αυτή την παράσταση. Χρησιμοποιήσαμε ADDCOLUMNS για να expand τον πίνακα από πριν με μια στήλη που ονομάζεται PreviousColorSales. Τα περιεχόμενα αυτής της στήλης ορίζονται στη στήλη CurrentYearSales, η οποία είναι SUM(FactInternetSales[SalesAmount]), για το previous Color (που ανακτώνται χρησιμοποιώντας OFFSET).

Το αποτέλεσμα είναι:

Χρώμα CalendarYear CurrentYearSales PreviousColorSales
"Μαύρο" 2017 393885
"Μαύρο" 2018 1818835 393885
"Μαύρο" 2019 3981638 1818835
"Μαύρο" 2020 2644054 3981638
"Blue" 2019 994448 2644054
"Blue" 2020 1284648 994448
"Πολλαπλών" 2019 48622 1284648
"Πολλαπλών" 2020 57849 48622
"NA" 2019 207822 57849
"NA" 2020 227295 207822
"Red" 2017 2961198 227295
"Red" 2018 3686935 2961198
"Red" 2019 900175 3686935
"Red" 2020 176022 900175
"Ασημί" 2017 326399 176022
"Ασημί" 2018 750026 326399
"Ασημί" 2019 2165176 750026
"Ασημί" 2020 1871788 2165176
"Λευκό" 2019 2517 1871788
"Λευκό" 2020 2589 2517
"Yellow" 2018 163071 2589
"Yellow" 2019 2072083 163071
"Yellow" 2020 2621602 2072083

Αυτό είναι ένα βήμα πιο κοντά στον στόχο μας, αλλά if κοιτάμε προσεκτικά δεν ταιριάζει ακριβώς με αυτό που κυνηγάμε. Για παράδειγμα, για το [Silver, 2017] η PreviousColorSales έχει οριστεί σε [Red, 2020].

Προσθήκη ORDERBY

Αυτός ο ορισμός παραπάνω ισοδυναμεί με:

1stAttemptWithORDERBY = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "PreviousColorSales",
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([Color], ASC, [CalendarYear], ASC, [CurrentYearSales], ASC)
            ),
            [CurrentYearSales]
        )
    )

Σε αυτή την περίπτωση, η κλήση προς OFFSET χρησιμοποιεί ORDERBY για να διατάξει τον πίνακα κατά Color and CalendarYear σε αύξουσα σειρά, το οποίο καθορίζει αυτό που θεωρείται η previous γραμμή που επιστρέφεται.

Ο λόγος που αυτά τα δύο αποτελέσματα είναι ισοδύναμα είναι επειδή ORDERBYcontainsall αυτόματα στήλες από τη σχέση που δεν βρίσκονται σε PARTITIONBY. Δεδομένου ότι δεν καθορίστηκε PARTITIONBY, ORDERBY ορίζεται σε Χρώμα, CalendarYear and CurrentYearSales. Ωστόσο, δεδομένου ότι τα ζεύγη Χρώμα and CalendarYear στη σχέση είναι μοναδικά, η προσθήκη currentYearSales δεν αλλάζει το αποτέλεσμα. Σε fact, evenif έπρεπε να καθορίσουμε μόνο το Χρώμα σε ORDERBY, τα αποτελέσματα είναι τα ίδια, δεδομένου ότι το CalendarYear θα προστεθεί αυτόματα. Αυτό συμβαίνει επειδή η συνάρτηση θα προσθέσει όσες στήλες χρειάζεται για να ORDERBY προκειμένου να εξασφαλιστεί ότι κάθε γραμμή μπορεί να αναγνωριστεί μοναδικά από τις ORDERBYandPARTITIONBY στήλες:

1stAttemptWithORDERBY = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS(
        vRelation,
        "PreviousColorSales",
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([Color])
            ),
            [CurrentYearSales]
        )
    )

Προσθήκη PARTITIONBY

Now, για να σχεδόν λάβετε το αποτέλεσμα μετά από το οποίο μπορούμε να χρησιμοποιήσουμε PARTITIONBY, όπως φαίνεται στην παρακάτω παράσταση υπολογιζόμενου πίνακα:

UsingPARTITIONBY = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "PreviousColorSales",
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([CalendarYear]), 
                PARTITIONBY ([Color])
            ),
            [CurrentYearSales]
        )
    )

Παρατηρήστε ότι ο καθορισμός ORDERBY είναι προαιρετικός εδώ, επειδή ORDERBYcontainsall αυτόματα τις στήλες από τη σχέση που δεν καθορίζονται στο PARTITIONBY. Επομένως, η ακόλουθη παράσταση επιστρέφει τα ίδια αποτελέσματα καθώς ORDERBY ορίζεται αυτόματα σε CalendarYear and CurrentYearSales:

UsingPARTITIONBYWithoutORDERBY = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "PreviousColorSales",
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                PARTITIONBY ([Color])
            ),
            [CurrentYearSales]
        )
    )

Σημείωση

Παρόλο που ORDERBY έχει οριστεί σε CalendarYear and αυτόματα το CurrentYearSales, δεν παρέχεται εγγύηση για τη σειρά με την οποία θα προστεθούν. If CurrentYearSales προστίθεται πριν από το CalendarYear, η σειρά που προκύπτει δεν είναι ενσωματωμένη με το αναμενόμενο. Να είστε σαφείς όταν καθορίζετε ORDERBYandPARTITIONBY για να αποφύγετε τη σύγχυση and μη αναμενόμενα αποτελέσματα.

Και οι δύο παραστάσεις επιστρέφουν το αποτέλεσμα που κυνηγάμε:

Χρώμα CalendarYear CurrentYearSales PreviousYearSalesForSameColor
"Μαύρο" 2017 393885
"Μαύρο" 2018 1818835 393885
"Μαύρο" 2019 3981638 1818835
"Μαύρο" 2020 2644054 3981638
"Blue" 2019 994448
"Blue" 2020 1284648 994448
"Πολλαπλών" 2019 48622
"Πολλαπλών" 2020 57849 48622
"NA" 2019 207822
"NA" 2020 227295 207822
"Red" 2017 2961198
"Red" 2018 3686935 2961198
"Red" 2019 900175 3686935
"Red" 2020 176022 900175
"Ασημί" 2017 326399
"Ασημί" 2018 750026 326399
"Ασημί" 2019 2165176 750026
"Ασημί" 2020 1871788 2165176
"Λευκό" 2019 2517
"Λευκό" 2020 2589 2517
"Yellow" 2018 163071
"Yellow" 2019 2072083 163071
"Yellow" 2020 2621602 2072083

Όπως βλέπετε σε αυτόν τον πίνακα, η στήλη PreviousYearSalesForSameColor εμφανίζει τις πωλήσεις για το previousyear για το ίδιο χρώμα. Για το [Red, 2020], επιστρέφει τις πωλήσεις για [Red, 2019], and ούτω καθεξής. If δεν υπάρχει previousyear, για παράδειγμα, στην περίπτωση του [Red, 2017], δεν επιστρέφεται value.

Μπορείτε να θεωρήσετε PARTITIONBY ως έναν τρόπο για να divide τον πίνακα σε τμήματα στα οποία θα εκτελεστεί ο OFFSET υπολογισμός. Στο παραπάνω παράδειγμα, ο πίνακας διαιρείται σε όσα μέρη υπάρχουν χρώματα, ένα για κάθε χρώμα. Στη συνέχεια, μέσα σε κάθε τμήμα, η OFFSET υπολογίζεται, ταξινομημένη κατά CalendarYear.

Οπτικά, αυτό που συμβαίνει είναι το εξής:

Πίνακας που εμφανίζει OFFSET κατά CalendarYear

First, η κλήση για PARTITIONBY έχει ως αποτέλεσμα ο πίνακας να διαιρείται σε τμήματα, ένας για κάθε Χρώμα. Αυτό αντιπροσωπεύεται από τα ανοιχτό μπλε πλαίσια στην εικόνα πίνακα. Next, ORDERBY εξασφαλίζει ότι κάθε τμήμα ταξινομείται κατά CalendarYear (αντιπροσωπεύεται από τα πορτοκαλί βέλη). Τέλος, μέσα σε κάθε ταξινομημένο τμήμα, για κάθε γραμμή, OFFSET εντοπίζει τη γραμμή επάνω από αυτή and επιστρέφει αυτή value στη στήλη PreviousYearSalesForSameColor. Δεδομένου ότι για κάθε first γραμμή σε κάθε τμήμα δεν υπάρχει previous γραμμή στο ίδιο τμήμα, το αποτέλεσμα σε αυτή τη γραμμή για τη στήλη PreviousYearSalesForSameColor είναι κενό.

Για να επιτύχουμε το τελικό αποτέλεσμα, πρέπει απλώς να αφαιρέσουμε το CurrentYearSales από τις previousyear πωλήσεις για το ίδιο χρώμα που επιστρέφεται από την κλήση στο OFFSET. Δεδομένου ότι μας ενδιαφέρει not να εμφανίσουμε τις previousyear πωλήσεις για το ίδιο χρώμα, αλλά μόνο στις τρέχουσες year πωλήσεις and η year σε σχέση με year διαφορά. Αυτή είναι η τελική παράσταση υπολογιζόμενου πίνακα:

FinalResult = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "YoYSalesForSameColor",
        [CurrentYearSales] -
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([CalendarYear]),
                PARTITIONBY ([Color])
            ),
            [CurrentYearSales]
        )
    )

And ακολουθεί το αποτέλεσμα αυτής της παράστασης:

Χρώμα CalendarYear CurrentYearSales YoYSalesForSameColor
"Μαύρο" 2017 393885 393885
"Μαύρο" 2018 1818835 1424950
"Μαύρο" 2019 3981638 2162803
"Μαύρο" 2020 2644054 -1337584
"Blue" 2019 994448 994448
"Blue" 2020 1284648 290200
"Πολλαπλών" 2019 48622 48622
"Πολλαπλών" 2020 57849 9227
"NA" 2019 207822 207822
"NA" 2020 227295 19473
"Red" 2017 2961198 2961198
"Red" 2018 3686935 725737
"Red" 2019 900175 -2786760
"Red" 2020 176022 -724153
"Ασημί" 2017 326399 326399
"Ασημί" 2018 750026 423627
"Ασημί" 2019 2165176 1415150
"Ασημί" 2020 1871788 -293388
"Λευκό" 2019 2517 2517
"Λευκό" 2020 2589 72
"Yellow" 2018 163071 163071
"Yellow" 2019 2072083 1909012
"Yellow" 2020 2621602 549519

Χρήση MATCHBY

Ίσως παρατηρήσατε ότι δεν καθορίσαμε MATCHBY στη all. Σε αυτή την περίπτωση, δεν είναι απαραίτητο. Οι στήλες σε ORDERBYandPARTITIONBY (για όσο έχουν καθοριστεί στα παραπάνω παραδείγματα) επαρκούν για τη μοναδική αναγνώριση κάθε γραμμής. Δεδομένου ότι δεν καθορίσαμε MATCHBY, οι στήλες που καθορίζονται σε ORDERBYandPARTITIONBY χρησιμοποιούνται για τη μοναδική αναγνώριση κάθε γραμμής, ώστε να μπορούν να συγκριθούν για να επιτρέψουν OFFSET να δώσουν ένα ουσιαστικό αποτέλεσμα. If οι στήλες σε ORDERBYandPARTITIONBY δεν μπορούν να αναγνωρίσουν με μοναδικό τρόπο κάθε γραμμή, μπορούν να προστεθούν επιπλέον στήλες στον όρο ORDERBYif αυτές οι επιπλέον στήλες επιτρέπουν τη μοναδική αναγνώριση κάθε γραμμής. If αυτό είναι not δυνατό, επιστρέφεται μια error. Σε αυτή την last περίπτωση, ο καθορισμός MATCHBY μπορεί να βοηθήσει στην επίλυση του error.

If MATCHBY καθορίζεται, οι στήλες στον MATCHBYandPARTITIONBY χρησιμοποιούνται για τη μοναδική αναγνώριση κάθε γραμμής. If αυτό είναι not δυνατό, επιστρέφεται μια error. Even if MATCHBY δεν απαιτείται, εξετάστε το ενδεχόμενο να καθορίσετε ρητά MATCHBY για να αποφύγετε οποιαδήποτε σύγχυση.

Συνεχίζοντας από τα παραπάνω παραδείγματα, ακολουθεί η last παράσταση:

FinalResult = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "YoYSalesForSameColor",
        [CurrentYearSales] -
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([CalendarYear]),
                PARTITIONBY ([Color])
            ),
            [CurrentYearSales]
        )
    )

If θέλουμε να είμαστε σαφείς σχετικά με τον τρόπο με τον οποίο οι γραμμές πρέπει να προσδιορίζονται με μοναδικό τρόπο, μπορούμε να καθορίσουμε MATCHBY, όπως φαίνεται στην παρακάτω ισοδύναμη παράσταση:

FinalResultWithExplicitMATCHBYOnColorAndCalendarYear = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "YoYSalesForSameColor",
        [CurrentYearSales] -
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([CalendarYear]),
                PARTITIONBY ([Color]),
                MATCHBY ([Color], [CalendarYear])
            ),
            [CurrentYearSales]
        )
    )

Δεδομένου ότι καθορίζεται MATCHBY, αμφότερες οι στήλες που καθορίζονται στο MATCHBY καθώς και σε PARTITIONBY χρησιμοποιούνται για τη μοναδική αναγνώριση των γραμμών. Δεδομένου ότι το Color καθορίζεται και στις δύο MATCHBYandPARTITIONBY, η παρακάτω παράσταση ισοδυναμεί με την previous παράσταση:

FinalResultWithExplicitMATCHBYOnCalendarYear = 
    VAR vRelation = SUMMARIZECOLUMNS ( 
        DimProduct[Color], 
        DimDate[CalendarYear], 
        "CurrentYearSales", ROUND ( SUM ( FactInternetSales[SalesAmount] ), 0 )
        )
    RETURN
    ADDCOLUMNS (
        vRelation,
        "YoYSalesForSameColor",
        [CurrentYearSales] -
        SELECTCOLUMNS (
            OFFSET (
                -1,
                vRelation,
                ORDERBY ([CalendarYear]),
                PARTITIONBY ([Color]),
                MATCHBY ([CalendarYear])
            ),
            [CurrentYearSales]
        )
    )

Δεδομένου ότι ο καθορισμός MATCHBY δεν είναι απαραίτητος στα παραδείγματα που εξετάσαμε μέχρι στιγμής, ας δούμε ένα ελαφρώς διαφορετικό παράδειγμα που απαιτεί MATCHBY. Σε αυτή την περίπτωση, έχουμε μια λίστα γραμμών παραγγελιών. Κάθε γραμμή αντιπροσωπεύει μια γραμμή παραγγελίας για μια παραγγελία. Μια παραγγελία μπορεί να έχει πολλές γραμμές παραγγελιών and γραμμή παραγγελίας 1 εμφανίζεται σε πολλές παραγγελίες. Επιπλέον, για κάθε γραμμή παραγγελίας έχουμε ένα ProductKey and ένα SalesAmount. Μια sample των σχετικών στηλών στον πίνακα μοιάζει κάπως έτσι:

SalesOrderNumber SalesOrderLineNumber ProductKey SalesAmount
SO51900 1 528 4.99
SO51948 1 528 5.99
SO52043 1 528 4.99
SO52045 1 528 4.99
SO52094 1 528 4.99
SO52175 1 528 4.99
SO52190 1 528 4.99
SO52232 1 528 4.99
SO52234 1 528 4.99
SO52234 2 529 3.99

Παρατηρήστε ότι οι and SalesOrderLineNumber απαιτούνται και οι δύο για τον μοναδικό προσδιορισμό των γραμμών.

Για κάθε παραγγελία, θέλουμε να επιστρέψουμε το previous ποσό πωλήσεων του ίδιου product (αντιπροσωπεύεται από το ProductKey) που έχει παραγγελθεί από το SalesAmount σε φθίνουσα σειρά. Η ακόλουθη παράσταση δεν θα λειτουργήσει, επειδή πιθανώς υπάρχουν πολλές γραμμές στη σχέση vRelation καθώς μεταβιβάζονται στο OFFSET:

ThisExpressionFailsBecauseMATCHBYIsMissing = 
    ADDCOLUMNS (
        FactInternetSales,
        "Previous Sales Amount",
            SELECTCOLUMNS (
                OFFSET (
                    -1,
                    FactInternetSales,
                    ORDERBY ( FactInternetSales[SalesAmount], DESC ),
                    PARTITIONBY ( FactInternetSales[ProductKey] )
                ),
                FactInternetSales[SalesAmount]
            )
    )

Αυτή η παράσταση επιστρέφει μια error: "OFFSETπαράμετρος Relation μπορεί να έχει διπλότυπες γραμμές, το οποίο δεν επιτρέπεται."

Προκειμένου να λειτουργήσει αυτή η παράσταση, MATCHBY πρέπει να καθοριστεί and πρέπει να περιλαμβάνει all στήλες που define μοναδικά μια γραμμή. MATCHBY απαιτείται εδώ, επειδή η σχέση, FactInternetSales, δεν περιέχει ρητά κλειδιά or μοναδικές στήλες. Ωστόσο, οι στήλες SalesOrderNumber and SalesOrderLineNumber μαζί σχηματίζουν ένα σύνθετο κλειδί, όπου η ύπαρξή τους είναι μοναδική στη σχέση and, επομένως, μπορούν να αναγνωρίσουν μοναδικά κάθε γραμμή. Απλώς καθορίζοντας το SalesOrderNumber or salesOrderLineNumber δεν είναι αρκετό, καθώς και οι δύο στήλες περιέχουν επαναλαμβανόμενες values. Η ακόλουθη παράσταση επιλύει το πρόβλημα:

ThisExpressionWorksBecauseOfMATCHBY = 
    ADDCOLUMNS (
        FactInternetSales,
        "Previous Sales Amount",
            SELECTCOLUMNS (
                OFFSET (
                    -1,
                    FactInternetSales,
                    ORDERBY ( FactInternetSales[SalesAmount], DESC ),
                    PARTITIONBY ( FactInternetSales[ProductKey] ),
                    MATCHBY ( FactInternetSales[SalesOrderNumber], 
                                FactInternetSales[SalesOrderLineNumber] )
                ),
                FactInternetSales[SalesAmount]
            )
    )

And αυτή η παράσταση όντως επιστρέφει τα αποτελέσματα που κυνηγάμε:

SalesOrderNumber SalesOrderLineNumber ProductKey SalesAmount ποσό πωλήσεων Previous
SO51900 1 528 5.99
SO51948 1 528 4.99 5.99
SO52043 1 528 4.99 4.99
SO52045 1 528 4.99 4.99
SO52094 1 528 4.99 4.99
SO52175 1 528 4.99 4.99
SO52190 1 528 4.99 4.99
SO52232 1 528 4.99 4.99
SO52234 1 528 4.99 4.99
SO52234 2 529 3.99

ORDERBY PARTITIONBY MATCHBY INDEX OFFSET WINDOW RANK ROWNUMBER