Проблема здесь в том, что вторым аргументом TOPN
должна быть таблица, а не столбец без фильтра.
Независимо от того, чем является category
, ALL(play[customer])
возвращает таблицу:
customer
--------
xx
yy
zz
jj
qq
ff
Мера [amount]
все еще оценивается в контексте фильтра category
, хотя для category = "a"
вы получаете
customer [amount]
------------------
xx 10
yy 12
zz 13
jj
qq
ff
, а для category = "b"
вы получаете
customer [amount]
------------------
xx
yy
zz
jj 15
qq 16
ff 9
Эти пробелы считаются меньшими, чем любое число, поэтому они выбираются при сортировке ASC
.
Попробуйте вместо этого слегка измененную меру:
Top 2 customer per category ASC =
VAR rnk = VALUES ( play[customer] )
RETURN
CALCULATE (
[amount],
TOPN ( 2, CALCULATETABLE ( play, ALL ( play[customer] ) ), [amount], ASC ),
RNK
)
Использование CALCULATETABLE
, контекст фильтра category
сохраняется.
PS Чтобы сгенерировать таблицы выше, вы можете написать новую вычисляемую таблицу следующим образом:
Top2Table =
CALCULATETABLE (
ADDCOLUMNS ( ALL ( play[customer] ), "amount", [amount] ),
play[category] = "a" <or "b">
)