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


Κατανόηση των συναρτήσεων ORDERBY, PARTITIONBY και MATCHBY

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

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

Σενάριο

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

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

Αυτή η παράσταση υπολογιζόμενου πίνακα χρησιμοποιεί τη ΣΥΝΆΡΤΗΣΗ SUMMARIZECOLUMNS για τον υπολογισμό της τιμής SUM της στήλης SalesAmount στον πίνακα FactInternetSales, από τη στήλη Χρώμα από τον πίνακα DimProduct και τη στήλη CalendarYear από τον πίνακα DimDate. Δείτε το αποτέλεσμα:

Color 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

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

Χρήση ΜΕΤΑΤΌΠΙΣΗς

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

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

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

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

Color 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

Αυτό είναι ένα βήμα πιο κοντά στον στόχο μας, αλλά αν κοιτάξουμε προσεκτικά δεν ταιριάζει ακριβώς με αυτό που κυνηγάμε. Για παράδειγμα, για το [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 και CalendarYear σε αύξουσα σειρά, το οποίο καθορίζει τι θεωρείται η προηγούμενη γραμμή που επιστρέφεται.

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

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

Τώρα, για να έχουμε σχεδόν το αποτέλεσμα, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση 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 είναι προαιρετικός εδώ, επειδή η ORDERBY περιέχει αυτόματα όλες τις στήλες από τη σχέση που δεν έχουν καθοριστεί στο PARTITIONBY. Επομένως, η ακόλουθη παράσταση επιστρέφει τα ίδια αποτελέσματα καθώς η ORDERBY ορίζεται αυτόματα σε CalendarYear και 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 και CurrentYearSales, δεν παρέχεται εγγύηση για τη σειρά με την οποία θα προστεθούν. Εάν προστεθεί η CurrentYearSales πριν από το CalendarYear, η σειρά που προκύπτει δεν είναι ενσωματωμένη με το αναμενόμενο. Να είστε σαφείς κατά τον καθορισμό των ORDERBY και PARTITIONBY για να αποφύγετε σύγχυση και μη αναμενόμενα αποτελέσματα.

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

Color 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 εμφανίζει τις πωλήσεις για το προηγούμενο έτος για το ίδιο χρώμα. Για το [Red, 2020], επιστρέφει τις πωλήσεις για [Red, 2019] και ούτω καθεξής. Εάν δεν υπάρχει προηγούμενο έτος, για παράδειγμα, στην περίπτωση του [Red, 2017], δεν επιστρέφεται καμία τιμή.

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

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

Table showing OFFSET by Calendar Year

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

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

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]
        )
    )

Και αυτό είναι το αποτέλεσμα αυτής της παράστασης:

Color 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. Σε αυτή την περίπτωση, δεν είναι απαραίτητο. Οι στήλες ΤΩΝ ORDERBY και PARTITIONBY (για όσο έχουν καθοριστεί στα παραπάνω παραδείγματα) επαρκούν για τη μοναδική αναγνώριση κάθε γραμμής. Δεδομένου ότι δεν καθορίσαμε την MATCHBY, οι στήλες που καθορίζονται στα στοιχεία ORDERBY και PARTITIONBY χρησιμοποιούνται για τη μοναδική αναγνώριση κάθε γραμμής, ώστε να μπορούν να συγκριθούν για να ενεργοποιήσουν την OFFSET για να δώσουν ένα ουσιαστικό αποτέλεσμα. Εάν οι στήλες των ORDERBY και PARTITIONBY δεν μπορούν να αναγνωρίσουν με μοναδικό τρόπο κάθε γραμμή, μπορούν να προστεθούν επιπλέον στήλες στον όρο ORDERBY εάν αυτές οι επιπλέον στήλες επιτρέπουν τη μοναδική αναγνώριση κάθε γραμμής. Εάν αυτό δεν είναι δυνατό, επιστρέφεται ένα σφάλμα. Στην τελευταία περίπτωση, ο καθορισμός της MATCHBY μπορεί να βοηθήσει στην επίλυση του σφάλματος.

Εάν έχει καθοριστεί η MATCHBY, οι στήλες των MATCHBY και PARTITIONBY χρησιμοποιούνται για τη μοναδική αναγνώριση κάθε γραμμής. Εάν αυτό δεν είναι δυνατό, επιστρέφεται ένα σφάλμα. Ακόμη και αν δεν απαιτείται η MATCHBY, εξετάστε το ενδεχόμενο να καθορίσετε ρητά τη MATCHBY για να αποφύγετε οποιαδήποτε σύγχυση.

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

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]
        )
    )

Εάν θέλουμε να είμαστε σαφείς σχετικά με τον τρόπο με τον οποίο οι γραμμές πρέπει να προσδιορίζονται μοναδικά, μπορούμε να καθορίσουμε τη 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 καθορίζεται σε αμφότερα τα MATCHBY και PARTITIONBY, η παρακάτω παράσταση ισοδυναμεί με την προηγούμενη παράσταση:

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. Σε αυτή την περίπτωση, έχουμε μια λίστα γραμμών παραγγελιών. Κάθε γραμμή αντιπροσωπεύει μια γραμμή παραγγελίας για μια παραγγελία. Μια παραγγελία μπορεί να έχει πολλές γραμμές παραγγελιών και η γραμμή παραγγελίας 1 εμφανίζεται σε πολλές παραγγελίες. Επιπλέον, για κάθε γραμμή παραγγελίας έχουμε ένα ProductKey και ένα SalesAmount. Ένα δείγμα των σχετικών στηλών στον πίνακα μοιάζει κάπως έτσι:

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

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

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

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

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

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

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

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

SalesOrderNumber SalesOrderLineNumber ProductKey SalesAmount Προηγούμενο ποσό πωλήσεων
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
ΔΕΊΚΤΗΣ
ΑΝΤΙΣΤΆΘΜΙΣΗ
ΠΑΡΆΘΥΡΟ
ΚΑΤΆΤΑΞΗ
ΑΡΙΘΜΌς ΓΡΑΜΜΏΝ