Κατανόηση των συναρτήσεων 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.
Οπτικά, αυτό που συμβαίνει είναι το εξής:
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 |
Related περιεχομένου
ORDERBY PARTITIONBY MATCHBY INDEX OFFSET WINDOW RANK ROWNUMBER