Reputation: 331
I would like to add an incremental refresh for one of our biggest transactional tables. This transactional table has this structure:
Order | Value | Index1 | Index2 |
---|---|---|---|
100 | 5 | 1 | 0 |
101 | 5 | 2 | 0 |
102 | 6 | 3 | 0 |
103 | 2 | 4 | 0 |
103 | 3 | 5 | 4 |
104 | 4 | 6 | 0 |
As you can see in order 103, there are two rows in (Index1: 4 &5). The booking with Index1 = 5, is the correction booking. That means that the row with Index1= 4 should be filtered out. The SQL code I am using to filter all false entries is this one:
SELECT DBA1.Order,
DBA1.Value
FROM AZ.SC DBA1
WHERE NOT EXISTS (SELECT *
FROM AZ.SC DBA2
WHERE DBA2.INDEX2 = DBA1.INDEX1)
Since this SQL will not allow "Query Folding" which is necessary for PBI Incremental refresh, I need somehow an approach within a DAX Measure, that will filter also all false entries. But how?
Please let me know if you need further information.
Upvotes: 0
Views: 1997
Reputation: 4877
If your idea is to import all of the rows and later filter the fact table keeping only the updated ones, a possible solution is to add a calculated column to be used in any measure that uses the fact table, stating if the row is to be considered or not. This can be achieved for instance with the following DAX code
IsValid =
VAR CurrentIndex = CALCULATETABLE( VALUES( SC[Index1] ) )
VAR RemovedIndexes = ALL( SC[Index2] )
RETURN
IF (
ISEMPTY( INTERSECT(CurrentIndex, RemovedIndexes) ),
1,
0
)
Otherwise, if the idea is to compute a calculated table with the older rows filtered out a possible implementation is
SC Filtered =
VAR AllIndexes = ALL( SC[Index1] )
VAR RemovedIndexes = ALL( SC[Index2] )
VAR ValidIndexes = EXCEPT( AllIndexes, RemovedIndexes )
RETURN
SUMMARIZECOLUMNS(
SC[Order],
SC[Value],
TREATAS( ValidIndexes, SC[Index1] )
)
But this might waste a lot of memory, since it almost duplicates the fact table.
Upvotes: 2